新しい StackOverflow API で少し遊んでいます。残念ながら、私のJSONは少し弱いので、助けが必要です。
ユーザーのこのJSONを逆シリアル化しようとしています:
{"user":{
"user_id": 1,
"user_type": "moderator",
"creation_date": 1217514151,
"display_name": "Jeff Atwood",
...
"accept_rate": 100
}}
JsonProperty
属性で装飾したオブジェクトに:
[JsonObject(MemberSerialization.OptIn)]
public class User
{
[JsonProperty("user_id", Required = Required.Always)]
public virtual long UserId { get; set; }
[JsonProperty("display_name", Required = Required.Always)]
public virtual string Name { get; set; }
...
}
次の例外が発生します。
Newtonsoft.Json.JsonSerializationException:JSONに必要なプロパティ 'user_id'が見つかりません。
これは、JSONオブジェクトが配列であるためですか?もしそうなら、どうすればそれを1つのUserオブジェクトに逆シリアル化できますか?
前もって感謝します!
Alexandre Jasminがあなたの質問のコメントで述べたように、結果のJSONには、逆シリアル化しようとしている実際のUser
オブジェクトのラッパーがあります。
回避策は、次のラッパークラスを使用することです。
public class UserResults
{
public User user { get; set; }
}
次に、逆シリアル化が機能します。
using (var sr = new StringReader(json))
using (var jr = new JsonTextReader(sr))
{
var js = new JsonSerializer();
var u = js.Deserialize<UserResults>(jr);
Console.WriteLine(u.user.display_name);
}
このラッパーには将来のメタデータプロパティがあります。応答タイムスタンプなので、それを使用することは悪い考えではありません!
ラッパークラスを作成したくない場合は、次の方法でユーザーにアクセスすることもできます。
String jsonString = "{\"user\":{\"user_id\": 1, \"user_type\": \"moderat...";
JToken root = JObject.Parse(jsonString);
JToken user = root["user"];
User deserializedUser = JsonConvert.DeserializeObject<User>(user.ToString());
詳細は Json.NETドキュメントのこのページ を参照してください。
@Alexandre Jasminの answer と同様に、.ToString()
で高レベルのJsonConvert
を使用する代わりに、中間JsonSerializerを使用して変換できます。それがもっと効率的かどうかわからない...
参照:
例:
var root = JObject.Parse(jsonString);
var serializer = new JsonSerializer();
var expectedUserObject = serializer.Deserialize<User>(root["user"].CreateReader());