簡體   English   中英

使用 C# 使用 JSON 進行反序列化的問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM