[英]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.