[英]Issue with Deserialization with JSON with C#
我在一個又一個例子中查看了一個例子,但我的嘗試都沒有奏效。
我正在嘗試反序列化這個 JSON 返回:
{
"status": "success",
"data": {
"result": "match",
"id_user": 26564,
"dob_match": null,
"first_name_match": null,
"last_name_match": null
},
"code": 200
}
這是我的 JSON 對象類聲明:
[DataContract]
internal class DccCoachApi
{
[DataMember]
public string result { get; set; }
public string id_user { get; set; }
public string dob_match { get; set; }
public string first_name_match { get; set; }
public string last_name_match { get; set; }
}
在我的流方法中,我的 streamRead 變量填充有: {"status":"success","data":{"result":"match","id_user":26564,"dob_match":null,"first_name_match":null,"last_name_match":null},"code":200}
方法 1 不填充 CoachId:
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead)))
{
// Deserialization from JSON
var deserializer = new DataContractJsonSerializer(typeof(DccCoachApi));
var dccObj = (DccCoachApi)deserializer.ReadObject(ms);
coachId = dccObj.id_user;
}
方法 2 也不行:
DccCoachApi coach = new JavaScriptSerializer().Deserialize<DccCoachApi>(streamRead);
coachId = coach.id_user;
方法 3 也不行:
JavaScriptSerializer js = new JavaScriptSerializer();
DccCoachApi dccObj = js.Deserialize<DccCoachApi>(streamRead);
coachId = dccObj.id_user;
方法 4 也不行:
dynamic dccObject = js.Deserialize<dynamic>(streamRead);
coachId = dccObject["id_user"];
當我直接從方法 4 中提取值時產生的硬錯誤是: System.Collections.Generic.KeyNotFoundException:字典中不存在給定的鍵。 在 System.Collections.Generic.Dictionary`2.get_Item(TKey 鍵)
方法 1-3 不會遇到硬錯誤,但是它們會在沒有數據的情況下填充 CoachId。
有人可以讓我知道我做錯了什么嗎?
您可以在這里簡單地生成適當的類: http : //json2csharp.com/
這就是您不需要 DataMember 屬性的樣子,它可能會混淆序列化程序只反序列化這個單個屬性:
public class Data
{
public string result { get; set; }
public int id_user { get; set; }
public object dob_match { get; set; }
public object first_name_match { get; set; }
public object last_name_match { get; set; }
}
public class RootObject
{
public string status { get; set; }
public Data data { get; set; }
public int code { get; set; }
}
代碼:
var deserializer = DataContractJsonSerializer(typeof(RootObject));
var root = (RootObject)deserializer.ReadObject(ms);
var coachId = root.data.id_user;
我將代碼修改成這樣,它完美地傾銷了我的價值。 非常感謝所有幫助我找到解決方案的人。 Plutonix,也感謝粘貼特殊的 411。我不知道存在。 很有用!
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
var streamRead = reader.ReadToEnd();
reader.Close();
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead)))
{
JavaScriptSerializer js = new JavaScriptSerializer();
DccCoachRootobject dccObj = js.Deserialize<DccCoachRootobject>(streamRead);
coachId = dccObj.data.id_user.ToString();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.