2012-06-08 48 views
0

我在磁盘上有一个非常大的.json文件。我想使用Jackson解析器将它作为Java对象实例化。使用Jackson解析一个非模式化json的大文件?

文件看起来是这样的:

[ { "prop1": "some_value", 
    "prop2": "some_other_value", 
    "something_random": [ 
     // ... arbitrary list of objects containing key/value 
     //  pairs of differing amounts and types ... 
    ] 
    }, 
    // ... repated many times ... 
    { 
    } 
] 

基本上它是对象的大数组,每个对象都有标识有两个string属性,然后另一对象的内部数组,其中每个对象属性的随机采集以及主要是字符串和整数的值,但也可能包含数组。

由于此对象布局,我没有可用于轻松实例化这些对象的集合模式。使用org.json处理器需要尝试为整个文件分配一个字符串,而这个字符串通常由于其大小而失败。所以我想使用流解析器,但我完全不熟悉它。

我最终想要的是一个Map,其中String是prop1的值,SomeObject是保存整个对象(顶级数组入口)数据的东西。也许只有JSON可以在需要时再解析?

无论如何,有关如何编写代码的想法是受欢迎的。

回答

3

由于您不想将整个事物作为单个对象进行绑定,因此您可能需要使用readValues()方法ObjectReader。如果单个值的结构是通用的,你可能想要将它们绑定为java.util.Map或者JsonNode(杰克逊的树模型)。所以你会这样做:

ObjectMapper mapper = new ObjectMapper(); 
ObjectReader reader = mapper.reader(Map.class); // or JsonNode.class 
MappingIterator<Map> it = reader.readValues(new File("stuff.json")); 
while (it.hasNextValue()) { 
    Map m = it.nextValue(); 
    // do something; like determine real type to use and: 
    OtherType value = mapper.convertValue(OtherType.class); 
} 

遍历整个事情。