私のJSONフィードには、次のようなネストされたオブジェクトがあります。
{
"id": 1765116,
"name": "StrozeR",
"birth": "2009-08-12",
"avatar": "http:\/\/static.erepublik.com\/uploads\/avatars\/Citizens\/2009\/08\/12\/f19db99e9baddad73981d214a6e576ef_100x100.jpg",
"online": true,
"alive": true,
"ban": null,
"level": 61,
"experience": 183920,
"strength": 25779.42,
"rank": {
"points": 133687587,
"level": 63,
"image": "http:\/\/www.erepublik.com\/images\/modules\/ranks\/god_of_war_1.png",
"name": "God of War*"
},
"Elite_citizen": false,
"national_rank": 6,
"residence": {
"country": {
"id": 81,
"name": "Republic of China (Taiwan)",
"code": "TW"
},
"region": {
"id": 484,
"name": "Hokkaido"
}
}
}
私のオブジェクトクラスは次のようなものです。
class Citizen
{
public class Rank
{
public int points { get; set; }
public int level { get; set; }
public string image { get; set; }
public string name { get; set; }
}
public class RootObject
{
public int id { get; set; }
public string name { get; set; }
public string avatar { get; set; }
public bool online { get; set; }
public bool alive { get; set; }
public string ban { get; set; }
public string birth { get; set; }
public int level { get; set; }
public int experience { get; set; }
public double strength { get; set; }
public List<Rank> rank { get; set; }
}
}
次のコードでJSONデータを解析しようとしています
private async void getJSON()
{
var http = new HttpClient();
http.MaxResponseContentBufferSize = Int32.MaxValue;
var response = await http.GetStringAsync(uri);
var rootObject = JsonConvert.DeserializeObject<Citizen.RootObject>(response);
uriTB.Text = rootObject.name;
responseDebug.Text = response;
}
しかし、次のエラーが発生します。
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Erepublik.Citizen+Rank]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
メインオブジェクトの値を解析することすらできません。とにかくこれを修正しますか?ネストされたオブジェクト内の値を解析するにはどうすればよいですか?例:「ランク」の「ポイント」
エラーメッセージにあるように、.NETクラスのrank
プロパティはList<Rank>
ですが、JSONでは配列ではなくネストされたオブジェクトです。 List<Rank>
ではなくRank
に変更します。
JSON(または実際には任意のJavascript)の配列は、[]
で囲まれています。 {}
文字は単一のオブジェクトを指定します。デシリアライズするには、CLRタイプがJSONタイプとほぼ一致している必要があります。オブジェクトからオブジェクト、配列から配列。