我正在尝试使用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,但无法获得"results"中的任何数据
这是我的代码
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);
除了"text"之外的所有内容都填充?当我输出该值时,文本的值为空。有什么好主意来完成我正在尝试的吗?
我不确定你期望得到什么反序列化JSON字符串到那种类型,text
不是对象的属性,所以没有理由期望它这样做。text
是results
列表中对象的属性。您还需要映射这些对象,然后通过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; }
}
如果您试图使用结果中的值来确定文本属性的值,您可以编写一个转换器来提取文本值。只需将JsonProperty
和JsonConverter
属性添加到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
对象。反序列化器无法知道在哪里放置这些值(没有相应的属性)。