2017-02-16 6 views
2

JSON文字列にデータの動的配列がある場合、JSONをC#(動的ではなく)オブジェクトに逆シリアル化する方法を教えてもらえますか? JSON下記のオブジェクトに矛盾するjsonを逆シリアル化する#

はボックスオブジェクトを持っている、それはNewtonsoft.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を含めることができます。

次に、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) ; 
} 

これはJavascriptにかなり近く、うまく機能し、inputに格納されます。

関連する問題