2017-08-30 272 views
1

我有一个JSON字符串,看起来与此类似:反序列化JSON选择对象从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 ... 
} 

所以,在我的情况,我知道数组中的僵尸对象将始终是相同的。但除此之外我什么都不知道。也就是说,可以有与zombies值相同的任意数量的值。

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

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

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

谢谢,我希望zombies使这个问题似乎冷却器笑

回答

1

创建一个僵尸类和解析JSON成。 Newtonsoft是足够聪明,它为您

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

现在解码,你可以做

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

我现在的代码库要求列表在'JToken's中,你知道我该如何得到列表吗?表示“僵尸”对象的'JToken'。 – visc

+1

就我个人而言,我不认为你正在使用JTokens来帮助你,因为它只有当你不确定它里面会发生什么时才会使用它。既然你只想将僵尸对象反序列化为一个已定义的对象,将会使它更容易处理。https://stackoverflow.com/questions/38211719/json-net-why-use-jtoken-ever –

+0

对,但在我的情况下,我不能完全改变实现。虽然好点。编辑:我正在使用'JToken' – visc

1

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

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) 
1

你可以将整个Json对象传入一个只有一个僵尸列表的对象作为它的集合。指定JsonPropertyAttribute它只会反序列化僵尸属性,并忽略它不能映射到对象上的东西。

假设一个僵尸类:

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数据,在包括你不知道的东西,而不想反序列化,作为一个字符串类型。

+0

'JsonProperty' – visc