2017-02-16 61 views
2

有人能告訴我如何將JSON反序列化爲C#(不使用C#動態)對象時JSON字符串是否有動態數據數組?將不一致的json反序列化到對象c#

下面給出JSON是有框對象,它可以包含的時尚單品陣列(它可以是褲子,毛衣,鞋子,...等)

{ 
    "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 
    } 
    } 
} 
+2

你'boxes'對象不是「時尚單品陣列」;它是一個包含數組的任意字段的記錄。您不能將它反序列化爲強類型數組,因爲它不是一個。你需要將'boxes'作爲屬性流來處理,或者使用LINQ來返回匿名類型; [JSON.NET](http://www.newtonsoft.com/json)可以兼得。 –

+0

請你給我任何閱讀這個JSON的例子嗎? –

回答

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

使用的NuGet來獲取Newtonsoft.JSON包。

然後你可以使用linq-to-json來處理這種數據對象。

例如,假設你的榜樣JSON字符串存儲在input

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) ; 
} 

這是非常接近的Javascript和行之有效的。