我有一个从HttpRequest返回的json字符串,我正在尝试反序列化为一个对象。 json有一个在我的情况下不需要的根元素(使用相同数据的其他应用程序,需要它以便它不能被删除)。我尝试了几种不同的方法,但我的对象始终为null。我可以在监视窗口中看到json正在从请求中正确返回。关于我缺少什么的任何想法?
我的代码如下。
这是我试图反序列化的对象。
public class BrandHeaderResponse
{
public BrandHeaderData brandHeaderData { get; set; }
}
public class BrandHeaderData
{
public dynamic Image { get; set; } //url and alt text
public string BackgroundColor { get; set; }
public string LiveText { get; set; }
}
这是代码
HttpResponseMessage response;
using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url)))
{
response = await webClient.SendAsync(request, requestHeaders);
}
using (var stream = await response.Content.ReadAsStreamAsync())
{
using (var sr = new StreamReader(stream))
{
using (var reader = new JsonTextReader(sr))
{
var serializer = new JsonSerializer();
var data = serializer.Deserialize<T>(reader);
return data;
}
}
}
最后,这是json。
{
"2000_banner":{
"ComponentName":"2000_banner",
"SchemaName":"Brand Banner",
"BrandName":"Rockport - Dummy Banner",
"LogoTextColor":"Dark",
"Image":{
"ImageUrl":"http://n.media.com/staging/24?w=153&h=64",
"AltText":"Burberry"
},
"LiveText":"This is dummy brand text for Rockport.",
"BackgroundColor":"E3D9CE"
}
}
答案 0 :(得分:1)
我认为没有任何理由不反序列化为Dictionary<string, BrandHeaderData>
,然后设置
new BrandHeaderResponse { brandHeaderData = dictionary.Values.SingleOrDefault() };
开销应该是最小的
但是,如果由于某种原因你想避免这种开销,因为你已经通过JsonTextReader
阅读,你可以使用阅读器迭代JSON流,直到找到第一个嵌套值,然后反序列化,使用以下扩展方法:
public static class JsonExtensions
{
public static IEnumerable<T> DeserializeValues<T>(Stream stream)
{
var reader = new StreamReader(stream); // Caller should dispose
return DeserializeValues<T>(reader);
}
public static IEnumerable<T> DeserializeValues<T>(TextReader textReader)
{
var ser = JsonSerializer.CreateDefault();
var reader = new JsonTextReader(textReader); // Caller should dispose
reader.SupportMultipleContent = true;
while (reader.Read())
{
if (reader.Depth > 0
&& reader.TokenType != JsonToken.None && reader.TokenType != JsonToken.Undefined && reader.TokenType != JsonToken.PropertyName)
{
yield return ser.Deserialize<T>(reader);
}
}
}
}
然后使用DeserializeValues<BrandHeaderData>(stream).SingleOrDefault()
反序列化您的JSON流。