1

次のJSONがあります

{
  "nest1" : {
    "attributes" : {
      "type" : "irrelevant",
      "url" : "irrelevant"
    },
    "key" : "value1"
  },
  "nest2" : {
    "attributes" : {
      "type" : "irrelevant",
      "url" : "irrelevant"
    },
    "key" : "value2"
  }
}

秒の値を取得するために以下のようなことを試みましたkeyが、これはInvalidOperationException. 次のエラー メッセージが表示されます。

Newtonsoft.Json.Linq.JProperty の子の値にアクセスできません。

string value = getJson(json, "key");

メソッドは次のようになります

public string getJson(string json, string name)
    {
       JObject token = JObject.Parse(json);
       JToken jtoken = token.Last.ToString();
       return jtoken[name].toString();
    }

おそらく私が忘れている単純なものがあると思います。どんな助けでも素晴らしいでしょう

4

3 に答える 3

2
dynamic dynObj = JsonConvert.DeserializeObject(json);
foreach (var item in dynObj)
{
    foreach (var subitem in item)
    {
        Console.WriteLine("url:" + subitem.attributes.url);
        Console.WriteLine("key:" + subitem.key);
    }
}
于 2012-06-06T20:41:23.617 に答える
2

コードには 2 つの問題があります。

  1. 使い方ToString()が間違っています。a をあなたのように暗黙的に変換するstringJToken、結果には文字列が表すオブジェクトではなくtextJTokenが含まれます。したがって、への呼び出しを取り除く必要があります。ToString()
  2. Lastの値を返すのではなくnest2、プロパティ全体を返します。最後のプロパティの値だけを取得するには、 のようなものを使用できますtoken.PropertyValues().Last()

したがって、コードは次のようになります。

public static string GetJson(string json, string name)
{
    JObject obj = JObject.Parse(json);
    JToken lastValue = obj.PropertyValues().Last();
    return lastValue[name].Value<string>();
}

また、最後ToString()Value<string>()に変更しました。これは、結果が変わらなくても、ここの方が理にかなっているからです。

于 2012-06-06T23:04:48.133 に答える