Код: Выделить всё
{
"Name":"foo",
"widgetCollection":[{"name","foo"}, {"name","foo"},],
"cogCollection": [{"name","foo"}, {"childCogs",},],
}
Код: Выделить всё
public class SuperWidget : IWidget
{
public string Name { get; set; }
public ICollection WidgetCollection { get; set; }
public ICollection CogCollection { get; set; }
public SuperWidget()
{
}
[JsonConstructor]
public SuperWidget(IEnumerable widgets, IEnumerable cogs)
{
WidgetCollection = new Collection();
CogCollection = new Collection();
foreach (var w in widgets)
{
WidgetCollection.Add(w);
}
foreach (var c in cogs)
{
CogCollection.Add(c);
}
}
}
Код: Выделить всё
[Serializable]
public class Cog : ICog
{
public string name { get; set; }
public ICollection childCogs { get; set; }
}
Обновление:
Предположение Ювала Ицчакова о том, что этот вопрос, вероятно, является дубликатом, в некоторой степени верно (кажется). В указанном сообщении один из ответов на странице предлагает то же решение, что и здесь. Я не заметил этого ответа, поскольку вопрос ОП отличался от того, который был у меня здесь. Моя ошибка.
-------мое решение--------
Как я уже сказал: решение Мэтта потребовало немного работы, но у меня есть кое-что, что работает для меня. Единственное, что мне не понравилось в его первоначальном решении, это такие строки:
Код: Выделить всё
return objectType == typeof(ICog);
Код: Выделить всё
public class GenericJsonConverter: JsonConverter, IBaseJsonConverter
{
private readonly IUnityContainer Container;
public GenericJsonConverter(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(reader);
var result = Container.Resolve();
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());
Надеюсь, кто-нибудь еще найдет это полезным в будущем!