从JSON字符串反序列化选定的JSON对象

时间:2017-08-30 15:29:04

标签: c# json

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

public static void flatten( File _src, File _dest ) throws DocumentException, IOException {
        PdfReader reader = null;
        PdfStamper stamper = null;
        FileOutputStream fos = null;

    try{
        fos = new FileOutputStream( _dest );
        reader = new PdfReader( _src.getAbsolutePath() );
        stamper = new PdfStamper( reader, fos );
        stamper.setFormFlattening( true );

        stamper.close();
    }finally{
        if ( reader != null ) reader.close();
        if ( fos != null ) try{ fos.close(); }catch( IOException ignored ){}
    }
}

所以,在我的场景中,我知道数组中的Zombie对象将始终是相同的。但除此之外,我什么都不知道。也就是说,在{ "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 ... } 值的同一根处可以有任意数量的值。

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

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

另外,我尝试了Json.NET,但只能处理响应字符串中指定了一个僵尸的情况。

谢谢,我希望JsonConvert.DeserializeObject<dynamic>(responseString);让这个问题看起来更酷lol

3 个答案:

答案 0 :(得分:1)

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

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

现在你可以做到

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

答案 1 :(得分: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)

答案 2 :(得分:1)

你可以将整个Json对象传递给一个只有一个Zombies列表作为其集合的对象。指定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数据,包括您不知道并且不想反序列化的内容,作为字符串类型。