我有类似于:的JSON文件
[
12,
[
{
"id": "131",
"name": "Cate"
},
{
"id": "132",
"name": "Mike"
}
],
"Result OK"
]和代码:
private static void Main(string[] args)
{
using (var r = new StreamReader(@"C:\Path\data1.json"))
{
var json = r.ReadToEnd();
try
{
var items = JsonConvert.DeserializeObject<JsonBody>(json);
Console.WriteLine(items);
}
catch (JsonSerializationException ex)
{
Console.WriteLine(ex);
}
}
}
public class JsonBody
{
public int someint;
public List<Dictionary<string, Item>> item;
public string somestring;
}
public class Item
{
[JsonProperty("id")] public string id;
[JsonProperty("name")] public string name;
}错误:无法将当前的JSON数组(例如,1,2,3)反序列化为'Json_parser.Parse2+JsonBody‘类型,因为该类型需要一个JSON对象(例如,{“名称”:“值”})才能正确地反序列化.
应该在代码中重写哪些内容以避免此错误。如何正确解析这个JSON?我需要从项目类中获取所有的项目。
发布于 2019-12-20 09:11:24
由于JSON文档的根是一个列表,所以需要使用C#使用Json.Net将其反序列化为集合类型。不幸的是,这种具有混合元素类型的数据结构有点难以使用。
如果您100%知道文档的根将始终是一个数组,则可以这样反序列化它:
JArray root = JArray.Parse(json);然后,如果您100%知道该数组的第二个元素是您感兴趣的项的嵌套数组,则可以使用以下方法:
Item[] items = root[1].ToObject<Item[]>();因此,您的方法可以简化为:
string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
Item[] items = root[1].ToObject<Item[]>();但是,如果您需要搜索嵌套数组,因为它并不总是第二个元素,您可以使用以下命令:
string json = File.ReadAllText(@"C:\Path\data1.json");
JArray root = JArray.Parse(json);
foreach (var element in root)
if (element is JArray)
{
Item[] items = element.ToObject<Item[]>();
// ...
}发布于 2019-12-20 09:25:36
乍一看,这个问题来自我们用于反序列化的模型。
试一试这一种,在这种情况下,字典只替换为您的模型项:
public class JsonBody
{
public int someint;
public List<Item> item;
public string somestring;
}正如@LasseV.Karlsen所提到的,它需要反序列化为一个JsonBody列表,因此您还必须修改这一行代码:
var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);https://stackoverflow.com/questions/59422363
复制相似问题