将不一致的json反序列化为对象c#

时间:2017-02-16 17:47:47

标签: c# json serialization json.net

当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
    }
  }
}

3 个答案:

答案 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);

小提琴:https://dotnetfiddle.net/Sxz8P3

答案 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。