首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json.net -反序列化JSON -ignoring根元素?

Json.net -反序列化JSON -ignoring根元素?
EN

Stack Overflow用户
提问于 2016-06-23 00:44:38
回答 1查看 1.3K关注 0票数 0

我有一个从HttpRequest返回的json字符串,我试图将它反序列化为一个对象。json有一个在我的例子中不需要的根元素(其他使用相同数据的应用程序需要它,所以它不能被删除)。我尝试过几种不同的方法,但是我的对象总是空的。我可以在监视窗口中看到json正在从请求中正确返回。你知道我遗漏了什么吗?

我的代码如下。

这是我试图反序列化的对象。

代码语言:javascript
复制
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; }
}

以下是代码

代码语言:javascript
复制
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。

代码语言:javascript
复制
{  
   "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"
      }
  }
EN

回答 1

Stack Overflow用户

发布于 2016-06-23 02:34:51

我看不出有什么理由不反序列化为Dictionary<string, BrandHeaderData>,然后设置

代码语言:javascript
复制
new BrandHeaderResponse { brandHeaderData = dictionary.Values.SingleOrDefault() };

开销应该是最小的

但是,如果出于某种原因您希望避免这种开销,因为您已经在通过JsonTextReader读取数据,您可以使用读取器遍历JSON流,直到找到第一个嵌套值,然后使用以下扩展方法对其进行反序列化:

代码语言:javascript
复制
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流。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37973962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档