Я пытался заставить это работать с DataContractJsonSerializer, JavaScriptSerializer и JSON.Net, и ни один из них не мог десериализовать напрямую к объекту успешно во всех случаях.Я использовал такой же подход, как и LB, используя JSON.Net, но без использования динамического элемента и дополнительного класса JsonObject.Адаптация моего кода к вашему сценарию будет выглядеть примерно так:
private List<ItemGroup> ParseItemGroupList(string input)
{
JObject json = JObject.Parse(input);
List<ItemGroup> groups = new List<ItemGroup>();
JArray gArray = json["groups"] as JArray;
foreach (var gToken in gArray)
{
ItemGroup newGroup = new ItemGroup();
JToken attrToken = gToken["attributes"] as JToken;
if (attrToken is JArray)
{
newGroup.Items = attrToken.Children().Select(MapDetailItem()).ToList();
}
else
{
newGroup.Items = new List<DetailItem>() { MapDetailItem().Invoke(attrToken) };
}
groups.Add(newGroup);
}
return groups;
}
private static Func<JToken, DetailItem> MapDetailItem()
{
return json => new DetailItem
{
SortOrder = (string)json["sortOrder"],
Value = (string)json["value"]
};
}
Надеемся, что кто-то добавит параметр для JSON.Net, чтобы разрешить десериализацию в коллекцию с одним элементом, а не бросатьисключение.Жаль, что вам придется выполнять весь анализ вручную, когда есть только одна небольшая часть JSON, которая не анализируется автоматически автоматически.