簡體   English   中英

C#子數組中的JSON反序列化

[英]JSON deserialization in C# sub array

我正在嘗試使用Newtonsoft.Json反序列化以下內容

{
    "max_id_str":"1234567",
    "results":[{
        "created_at":"Tue, 21 May 2013 03:06:23 +0000",
        "from_user":"Name Here",
        "from_user_id":33333,
        "text":"THE TEXT GOES HERE"
    }],
    "results_per_page":1,
    "since_id":0,
    "since_id_str":"0"
}

我可以使用反序列化來檢索max_id_str,但無法在“結果”中獲取任何數據

這是我的代碼

public class tweet
    {
        public string max_id_str { get; set; }
        public string text{ get; set; }
        public string results_per_page{ get; set; }
        public string since_id { get; set; }
        public string since_id_str { get; set; }
    }

然后,我創建該類的對象,然后嘗試將其反序列化為該對象

tweet t = new tweet();
t = JsonConvert.DeserializeObject<tweet>(e.Result);

除了“文本”之外的所有內容都在填充? 輸出值時,文本的值為null。 有什么想法可以完成我正在嘗試的工作嗎?

我不確定您期望將JSON字符串反序列化為該類型, text不是對象的屬性,因此沒有理由期望它這樣做。 textresults列表中對象的屬性。 您還需要映射那些對象,然后通過result對象訪問文本。

public class tweet
{
    public string max_id_str { get; set; }
    //public string text{ get; set; }
    public List<result> results { get; set; }
    public string results_per_page{ get; set; }
    public string since_id { get; set; }
    public string since_id_str { get; set; }
}

public class result
{
    public string created_at { get; set; }
    public string from_user { get; set; }
    public int from_user_id { get; set; }
    public string text { get; set; }
}

如果試圖使用結果中的值來確定文本屬性的值,則可以編寫一個轉換器以提取文本值。 只需將JsonPropertyJsonConverter屬性添加到您的text屬性並實現轉換器。

public class tweet
{
    public string max_id_str { get; set; }
    [JsonProperty("results")]
    [JsonConverter(typeof(TextPropertyResultExtractorConverter))]
    public string text { get; set; }
    public string results_per_page{ get; set; }
    public string since_id { get; set; }
    public string since_id_str { get; set; }
}

public class TextPropertyResultExtractorConverter : JsonConverter
{
    public override bool CanConvert(Type type)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var results = (JArray)serializer.Deserialize(reader);
        var result = results.First();
        return result.Value<string>("text");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

這是因為text是一個子元素,而在C#對象中,您直接在tweet中擁有它。 您缺少results對象作為屬性。 解串器無法知道將這些值放在何處(沒有相應的屬性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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