当JSON字符串具有动态数据数组时,有人能告诉我如何将JSON反序列化为C#(不使用C#动态)对象吗?
鉴于以下JSON有Boxes对象,它可以包含时尚物品数组(它可以是裤子,毛衣,鞋子......等)
{
"task": {
"id": 269740275,
"status": "success",
"error": null,
"date_created": "2017-02-16T10:33:41.827688Z",
"date_updated": "2017-02-16T10:33:42.417778Z",
"data": {
"width": 1062,
"boxes": {
"top-shirt": [
{
"xmin": 0.249980241060257,
"ymin": 0.1535395532846451,
"ymax": 0.476559966802597,
"xmax": 0.6146213412284851,
"proba": 0.9977585077285767
}
],
"shoe": [
{
"xmin": 0.3686676025390625,
"ymin": 0.9223044514656067,
"ymax": 0.9838011264801025,
"xmax": 0.4768480360507965,
"proba": 0.9748706817626953
}
],
"pants": [
{
"xmin": 0.3451904654502869,
"ymin": 0.4616038501262665,
"ymax": 0.909162700176239,
"xmax": 0.6047541499137878,
"proba": 0.9983627200126648
}
]
},
"height": 1503
}
}
}
答案 0 :(得分:2)
您可以使用字典来处理JSON(框)的动态部分。
像这样定义你的类:
public class RootObject
{
public Task task { get; set; }
}
public class Task
{
public int id { get; set; }
public string status { get; set; }
public object error { get; set; }
public DateTime date_created { get; set; }
public DateTime date_updated { get; set; }
public Data data { get; set; }
}
public class Data
{
public int width { get; set; }
public Dictionary<string, List<Item>> boxes { get; set; }
public int height { get; set; }
}
public class Item
{
public double xmin { get; set; }
public double ymin { get; set; }
public double ymax { get; set; }
public double xmax { get; set; }
public double proba { get; set; }
}
然后像这样反序列化:
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
答案 1 :(得分:1)
使用NuGet获取Newtonsoft.JSON包。
然后你可以使用linq-to-json来处理这种数据对象。
例如,假设您的示例JSON字符串存储在var message = JObject.Parse(input);
var width = (int)message["task"]["data"]["width"];
var height = (int)message["task"]["data"]["height"];
Console.WriteLine(width + " " + height);
var boxes = message["task"]["data"]["boxes"];
foreach (var box in boxes.Children<JProperty>())
{
Console.WriteLine(box.Name) ;
}
,
[['X', 'AX'],['X', 'XG'],['XG', 'AXG'],['AX', 'CAX'],['XG', 'XGG'],['AX', 'AXG']]
这非常接近Javascript并且效果很好。
答案 2 :(得分:0)
我认为 O. Jones 提供了最简单的解决方案,使用 Newtonsoft,Newtonsoft 确实是在 C# 中使用 JSON 做任何事情的最佳方法,而且没有任何麻烦。
这是最简单的例子之一
string json_string = @"{
Firstname: ""Jane"",
Lastname: ""Doe"",
Age: 36,
IsEmployed: true,
IsMarried: true,
Children: 4
}";
var person = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json_string);
Console.WriteLine(person.Forename);
Console.WriteLine(person.Lastname);
Console.WriteLine(person.Age);
Console.WriteLine(person.IsEmployed);
Console.WriteLine(person.IsMarried);
Console.WriteLine(person.Children);
无论结构如何,它都能即时生成对象!
我在这里写了一篇简单易懂的文章https://turmanauli.medium.com/a-complete-guide-for-serializing-json-to-dynamic-objects-on-the-fly-in-c-7ab4799f648d 关于如何在 Visual Studio 项目中使用 Newtonsoft。