【问题标题】:Deserialize selected JSON object from JSON string从 JSON 字符串反序列化选定的 JSON 对象
【发布时间】:2017-08-30 15:29:04
【问题描述】:

我有一个类似于此的 JSON 字符串:

{
    "automatic" : "true",
    "brainstorm" : "1000",
    "zombies" : [{ "Name" : "Fred", "Grrh" : "50" }, { "Name" : "Sally", "Grrh" : "67" }, { "Name" : "Chris", "Grrh" : "23" }],
    "nightSkyRadius" : "30"
    ... could be anything here or at the same level as zombies ...
}

所以,在我的场景中,我知道数组中的 Zombie 对象总是相同的。但除此之外我什么都不知道。也就是说,与zombies 值位于同一根的可能有任意数量的值。

所以我的问题是,如何使用 Json.NET 仅反序列化我的 zombies?我不知道其他值是什么(如果值是正确的术语),所以我不能只创建一个描述传入 Json 字符串的对象。所以我想我可以从 json 字符串中选择 zombies 然后反序列化它。

但是,我想,我必须编写一个字符串解析器,将zombies 拉出.. 这似乎是一个额外的不必要的步骤。 Json.NET 不能帮我做这个吗?

另外,我尝试过JsonConvert.DeserializeObject<dynamic>(responseString);,但这只能处理在响应字符串中指定一个僵尸时的情况。

谢谢,我希望zombies 让这个问题看起来更酷,哈哈

【问题讨论】:

    标签: c# json


    【解决方案1】:

    创建一个 Zombie 类并将 json 解析为该类。 Newtonsoft 足够聪明,可以为您解码

    public class zombies
    {
        public string Name;
        public int Grrh;
    }
    

    现在你可以做

    var zombies = JsonConvert.DeserializeObject<List<zombies>>(responseString);
    

    【讨论】:

    • 我当前的代码库要求列表位于JTokens 中,您知道我如何以这种方式获取列表吗? JToken 表示 zombies 对象。
    • 就我个人而言,我不认为您使用 JTokens 是在帮自己一个忙,因为它实际上只在您不确定里面会有什么时使用。由于您只希望僵尸对象将其反序列化为已定义的对象,这将使使用它变得更加容易。 stackoverflow.com/questions/38211719/…
    • 对,但在我的情况下,我不能完全改变实现。不过好点。编辑:我正在使用带有JToken 的 sql 接口
    【解决方案2】:

    如果您只需要僵尸数组,您可以简单地反序列化对象,只需一个僵尸自动属性数组

    public class Zombie {
    public string Name {get;set;}
    public string Grrh {get;set;}
    }
    
    public class Zombies {
    public IEnumerable<Zombie> ZombieCollection {get;set;}
    }
    

    然后

    JsonConvert.DeserializeObject<Zombies>(responseString)
    

    【讨论】:

      【解决方案3】:

      您可以将整个 Json 对象传递给一个对象,其中仅包含一个僵尸列表作为其上的集合。指定JsonPropertyAttribute,它将只反序列化zombies属性,并忽略它无法映射到对象上的所有其他内容。

      假设一个僵尸类:

      public class Zombie
      {
          public string Name { get; set; }
          public string Grrh {get; set; }
      }
      

      还有一个类来保存整个 json 对象(这将只是僵尸集合)

      public class MyZombieJsonData
      {
          [JsonProperty(PropertyName = "zombies")]
          public List<Zombie> ZombieList { get; set; }
      }
      

      那么无论您在哪里可以访问 json 字符串,都可以:

      JsonConvert.DeserializeObject<MyZombieJsonData>(theJsonDataAsAString);
      

      theJsonDataAsAString 是你的整个 Json 数据,包括你不知道和不想反序列化的东西,作为字符串类型。

      【讨论】:

      • 很好地使用JsonProperty
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2013-07-16
      • 2014-01-04
      • 2020-02-03
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多