解析 Json 文件 - Json 转换
Parse a Json File - JsonConvert
我有 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 对象(例如 {"name":"value"})正确反序列化。
应该在代码中重写什么来避免这个错误。
如何正确解析此 JSON?
我需要从项目 class.
中获取所有项目
由于您的 JSON 文档的根是一个列表,您需要使用 Json.Net 将其反序列化为 C# 中的集合类型。不幸的是,这种混合元素类型的数据结构有点难以使用。
如果您 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[]>();
// ...
}
乍一看问题出在我们用于反序列化的模型上。
试试这个,其中字典仅由您的模型项替换:
public class JsonBody
{
public int someint;
public List<Item> item;
public string somestring;
}
正如@Lasse V. Karlsen 所提到的,它需要被反序列化为一个 JsonBody 列表,因此您也必须更改这行代码:
var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);
我有 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 对象(例如 {"name":"value"})正确反序列化。
应该在代码中重写什么来避免这个错误。 如何正确解析此 JSON? 我需要从项目 class.
中获取所有项目由于您的 JSON 文档的根是一个列表,您需要使用 Json.Net 将其反序列化为 C# 中的集合类型。不幸的是,这种混合元素类型的数据结构有点难以使用。
如果您 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[]>();
// ...
}
乍一看问题出在我们用于反序列化的模型上。
试试这个,其中字典仅由您的模型项替换:
public class JsonBody
{
public int someint;
public List<Item> item;
public string somestring;
}
正如@Lasse V. Karlsen 所提到的,它需要被反序列化为一个 JsonBody 列表,因此您也必须更改这行代码:
var items = JsonConvert.DeserializeObject<List<JsonBody>>(json);