使用C#使用JSON进行反序列化的问题

时间:2017-10-13 19:09:16

标签: c# json deserialization

我在示例之后查看了示例,但我的尝试都没有奏效。

我试图反序列化此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。

有人可以让我知道我做错了吗?

2 个答案:

答案 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();
                }
            }