1

この JSON 文字列を逆シリアル化する適切な方法は何ですか? これは単に辞書の配列であり、各辞書には「タイトル」と「子」があり、子は辞書の別の配列です。

これを TreeView アイテム ソースとして使用していますが、ツリービューには Title1 > Child1 しか表示されません。また、Child1 の最初の子を印刷しようとしましたが、その方法がわかりません。以下のコードには、無効なキャスト例外があります。

s = @"[{""title"":""Title1"",""children"":[{""title"":""Child1"",""children"":[{""title"":""grandchild1"",""children"":[{""title"":""Huh""}]}] }] }]";

List<Dictionary<string, object>> marr = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(s);
mTreeView.ItemsSource = marr;

List<Dictionary<string,object>> cs = (List<Dictionary<string,object>>)marr[0]["children"];
Debug.WriteLine(cs[0]["title"]);
4

3 に答える 3

2

あなたは次のものを持っているように私には見えます:

class MyObject
{
    public string title { get; set; }
    public List<MyObject> children { get; set; }
}

var deserialized = JsonConvert.DeserializeObject<List<MyObject>>(s);

いいえ、ここには辞書はありません。

  • できる限り試してみてください。ここには、上記のオブジェクトの再帰的なリストほど「辞書」はありません。
  • とにかく、これは必要なオブジェクトの実際の定義であるため、単なる文字列の辞書ではなく、実際の型を持つことのすべての利点を活用できます。

コメントに対処するための注意: JSON 文字列が変更されても、コードが壊れることはありません。不要なプロパティは無視され、不足しているプロパティは正しく null に設定されます。

于 2013-04-09T02:15:05.607 に答える
0

現在、JSON.NET をそのまま使用してこれを実行できるようです。

var @object = JsonConvert.DeserializeObject(s)
var slightlyMoreUsefulObject = (JArray)@object;

var actualObject = slightlyMoreUsefulObject[0]

var topLevelTitle = actualObject["title"]

var children = actualObject["children"]
var firstChild = children[0]
var firstChildTitle = firstChild["title"]
于 2016-05-11T21:41:27.107 に答える