我在示例之后查看了示例,但我的尝试都没有奏效。
我试图反序列化此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; }
}
在我的stream方法中,我的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 key)
方法1-3没有遇到硬错误,但是他们填充了没有数据的coachId。
有人可以让我知道我做错了吗?
答案 0 :(得分:2)
您可以在此处生成适当的类: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;
答案 1 :(得分:0)
我修改了代码看起来像这样,它完全抛弃了我的价值。非常感谢帮助我找到解决方案的每个人。 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();
}
}