2

我正在尝试使用 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);

除了“文本”之外的所有内容都会填充?当我输出值时,文本的值为空。任何想法如何完成我正在尝试的事情?

4

2 回答 2

4

我不确定您期望将该 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; }
}

如果您尝试使用结果中的值来确定文本属性的值,则可以编写一个转换器来提取文本值。只需向您的属性添加一个JsonPropertyand属性并实现转换器。JsonConvertertext

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();
    }
}
于 2013-05-21T04:08:42.470 回答
1

这是因为它text是一个子元素,而在您的 C# 对象中,您直接在推文中拥有它。您缺少results作为属性的对象。反序列化器无法知道将这些值放在哪里(没有相应的属性)。

于 2013-05-21T04:04:48.107 回答