Json.net - 反序列化JSON - 签署根元素?

时间:2016-06-22 16:44:38

标签: c# json.net json-deserialization

我有一个从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"
      }
  }

1 个答案:

答案 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流。