我将通过说我知道问题是什么,我只是不知道如何解决它。我正在与以JSON形式返回数据的.NET SOA数据层进行通信。一种这样的方法返回一个对象,其中有多个集合。对象基本上是这样的:类型是一个接口或抽象类,不能实例化
{
"Name":"foo",
"widgetCollection":[{"name","foo"}, {"name","foo"},],
"cogCollection": [{"name","foo"}, {"childCogs",<<new collection>>},],
}
我的类,它表示这个对象是这样的:
public class SuperWidget : IWidget
{
public string Name { get; set; }
public ICollection<IWidget> WidgetCollection { get; set; }
public ICollection<ICog> CogCollection { get; set; }
public SuperWidget()
{
}
[JsonConstructor]
public SuperWidget(IEnumerable<Widget> widgets, IEnumerable<Cog> cogs)
{
WidgetCollection = new Collection<IWidget>();
CogCollection = new Collection<ICog>();
foreach (var w in widgets)
{
WidgetCollection.Add(w);
}
foreach (var c in cogs)
{
CogCollection.Add(c);
}
}
}
直到cogCollection添加一个子集合这个构造函数工作得很好,现在我得到上述错误。一个具体的COG类看起来是这样的:
[Serializable]
public class Cog : ICog
{
public string name { get; set; }
public ICollection<ICog> childCogs { get; set; }
}
我不想因为我使用的IoC到集合更改为具体类型。因为我正在使用IoC,所以我真的很想避免需要具有具体参数的JsonConstructors,但我还没有想出一种方法来实现这一点。任何建议将不胜感激!
更新:
尤瓦Itzchakov的建议,这个问题可能是一个重复的是有点真(似乎)。在引用的帖子中,页面中的一个答案提供了与此处提供的相同的解决方案。我没有注意到答案,因为OP的问题与我在这里的问题不同。我的错。
-------我的解决方案--------
正如我所说的:马特的解决了工作的一点点,但我得到的东西设置为我的作品。有一件事我不喜欢他的初步解决方案,是这样的诗句:
return objectType == typeof(ICog);
按照这个模式,你就需要有您收到过线每个抽象类型JsonConverter。这是低于我的情况理想,所以我创建了一个通用JsonConverter这样:
public class GenericJsonConverter<T>: JsonConverter, IBaseJsonConverter<T>
{
private readonly IUnityContainer Container;
public TalonJsonConverter(IUnityContainer container)
{
Container = container;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var target = serializer.Deserialize<Newtonsoft.Json.Linq.JObject>(reader);
var result = Container.Resolve<T>();
serializer.Populate(target.CreateReader(), result);
return result;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
然后就在我反序列化我的数据,我做这样的事情:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
settings.Converters.Add((JsonConverter)Container.Resolve<IBaseJsonConverter<ICog>>());
普罗蒂普:如果您使用Resharper,(JsonConverter)会在这种情况下给你一个可疑的强制性警告。
希望别人认为这有用!
尝试使用'JsonSerializerSettings'类的'TypeNameHandling.All'并将其传递给json串行器 –
[JSON.NET中反串行化的接口接口]可能的重复(http://stackoverflow.com/questions/5780888/ cast-interfaces-for-deserialization-in-json-net) –
[使用Json.NET转换器反序列化属性](http://stackoverflow.com/questions/2254872/using-json-net-converters-to -deserialize-properties) – nawfal