2017-04-21 1 views
-1

を使用して、複雑なJSONオブジェクトを作成するために、私は、このようなJSON構造を有する:どのようにC#

{ 
"name": "flare", 
"children": [ 
    { 
    "name": "analytics", 
    "children": [ 
    { 
    "name": "cluster", 
    "children": [ 
     {"name": "AgglomerativeCluster", "size": 3938}, 
     {"name": "MergeEdge", "size": 743} 
    ] 
    }, 
    { 
    "name": "graph", 
    "children": [ 
     {"name": "BetweennessCentrality", "size": 3534}, 
     {"name": "SpanningTree", "size": 3416} 
    ] 
    }, 
    { 
    "name": "optimization", 
    "children": [ 
     {"name": "AspectRatioBanker", "size": 7074} 
    ] 
    } 
    ] 
    }, 
    { 
    "name": "animate", 
    "children": [ 
    {"name": "Easing", "size": 17010}, 
    {"name": "FunctionSequence", "size": 5842}, 
    { 
    "name": "interpolate", 
    "children": [ 
     {"name": "ArrayInterpolator", "size": 1983}, 
     {"name": "RectangleInterpolator", "size": 2042} 
    ] 
    }, 
    {"name": "ISchedulable", "size": 1041}, 
    {"name": "Tween", "size": 6006} 
    ] 
    } 
] 
} 

私はC#を使用して、このようなJSONを生成することができ、私はJSON配列を作る方法を見つけたが、それは私が持っているすべてです方法。私はchildren":属性の作り方を知らないのですが、他のJSONオブジェクトや他のJSON配列で構成されるJSONオブジェクトを作成する方法がわかりません。あなたは私にそのようなJSONオブジェクトを生成できるように少し助けてくれますか?ありがとう。

+0

あなたは、既存のC#のオブジェクトを取得し、JSONにそれをシリアル化したいですか? –

+7

http://json2csharp.com/このサイトに既存のjson文字列を読み込むと、C#オブジェクトに必要なクラスが作成されます。 – vipersassassin

+0

あなたのjsonを手作業で書くのはかなり誤りがちです。なぜクラスをシリアライズしないのですか? –

答えて

2

あなたは(あなたがすべき)、あなたはこのようなクラスを作成することができますJson.Netを使用する場合:、ちょうどあなたがこのようなあなたのオブジェクトを作成する場合は、

public class MyObject 
{ 
    public string Name { get; set; } 
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public List<MyObject> Children { get; set; } 
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public int? Size { get; set; } 
} 

を(と私は、全体のことをやっていませんよ

var root = new MyObject() 
{ 
    Name = "flare", 
    Children = new List<MyObject>() 
    { 
     new MyObject() 
     { 
      Name = "analytics", 
      Children = new List<MyObject>() 
      { 
       new MyObject() 
       { 
        Name = "cluster", 
        Children = new List<MyObject>() 
        { 
         new MyObject() { Name = "AgglomerativeCluster", Size = 3938 } 
        } 
       } 
      } 
     } 
    } 
}; 

そして:

var json = JsonConvert.SerializeObject(root, new JsonSerializerSettings 
{ 
    ContractResolver = new CamelCasePropertyNamesContractResolver() 
})); 
明らかに、あなたは は、一度にすべてを移入するを持っていない) - いくつかのレベル(読みやすくするために事実の後にフォーマットされた)あなたを与えるだろう

{ 
    "name": "flare", 
    "children": [{ 
     "name": "analytics", 
     "children": [{ 
      "name": "cluster", 
      "children": [{ 
       "name": "AgglomerativeCluster", 
       "size": 3938 
      }] 
     }] 
    }] 
} 

ノートのカップル:

NullValueHandling = NullValueHandling.Ignoreあなたは値がnullのプロパティを含めることを抑制することができます。 Name = "flare"のオブジェクトがsize: nullの場合は気にする必要はありません。しかし、それを使用すると、少なくとも3つの異なるオブジェクトがありますが、ほとんど同じですが、いくつかのプロパティがありません。

CamelCasePropertyNamesContractResolverは、あなたのプロパティ名を自動的にキャカタリングします。 MyObjectのプロパティをラクラクにすることもできますが、これは.NET標準ではありません。その大会を破っても大丈夫なら、あなたはそれを必要としません。もう1つの方法は、各.NETプロパティのJsonPropertyAttributePropertyNameを設定することです。

1

Json.NETを使用すると、複雑なオブジェクトをシリアル化/逆シリアル化できます。

2

必要に応じて、あなたのクラスを定義します。

public class Human 
{ 
    public string name { get; set; } 
    public int size { get; set; } 
    public IEnumerable<Human> children { get; set; } 
} 

そして、JSONとしてそれを得るためにNewtonsoft、Json.NETまたは他のライブラリを使用します。

+0

これは、OPの問題かもしれないし、問題ではない '{" name ":" AgglomerativeCluster "、" size ":3938、" children ":null}'のようなものを与えるでしょう。 –

1

匿名型では、プレーンなJSONほど簡単にオブジェクト階層を定義できます。それからちょうどJson.Netを使用して、それをシリアル化:あなたは、動的なタイプが関与する必要があるかもしれない、より複雑な階層のために

var obj = new { 
    name = "flare", 
    children = new[] { 
     new { name = "analytics" }, 
     new { name = "animate" }, 
    } 
}; 
var json = JsonConvert.SerializeObject(obj, Formatting.Indented); 

。ここにあなたの元のオブジェクトは、次のとおりです。

var obj = new { 
    name = "flare", 
    children = new[] { 
     new { 
      name = "analytics", 
      children = new dynamic [] { 
       new { 
        name = "cluster", 
        children = new dynamic [] { 
         new { name = "AgglomerativeCluster", size = 3938}, 
         new { name = "MergeEdge", size = 743}, 
        } 
       }, 
       new { 
        name = "graph", 
        children = new dynamic [] { 
         new { name = "BetweennessCentrality", size = 3534}, 
         new { name = "SpanningTree", size = 3416}, 
        } 
       }, 
       new { 
        name = "optimization", 
        children = new dynamic [] { 
         new { name = "AspectRatioBanker", size = 7074}, 
        } 
       }, 
      } 
     }, 
     new { 
      name = "animate", 
      children = new dynamic [] { 
       new { name = "Easing", size = 17010}, 
       new { name = "FunctionSequence", size = 5842}, 
       new { 
        name = "interpolate", 
        children = new [] { 
        new { name = "ArrayInterpolator", size = 1983}, 
        new { name = "RectangleInterpolator", size = 2042} 
        } 
       }, 
       new { name = "ISchedulable", size = 1041}, 
       new { name = "Tween", size = 6006}, 
      } 
     }, 
    } 
}; 
var json = JsonConvert.SerializeObject(obj, Formatting.Indented); 

デモ:https://dotnetfiddle.net/u2HIt3