2014-01-29 278 views
0

的Java class JSONObject转换JSON对象到另一个JSON对象在Java中

我有一个JSON对象,从中我想只提取了一些键/值对到另一个JSON对象。另外,我想更改提取的键的名称。最后,我想让输出对象为“平坦”(即,所有元素深度为1)。

例如:

输入对象:

{ 
    "a":"val_a", 
    "b": 
    { 
     "b1":"val_b1", 
     "b2":"val_b2" 
    }, 
    "c": 
    { 
     "c1":"val_c1", 
     "c2": 
     { 
      "c21":"val_c21", 
      "c22":"val_c22" 
     } 
    } 
} 

输出对象:

{ 
    "x":"val_a", 
    "y":"val_b1", 
    "z":"val_c22" 
} 

什么是最好的( “清洁”)的方式来实现这一点?

目前,我提取领域的一个个“手动”,像这样(在上面的例子):

JSONObject output = new JSONObject(); 
output.put("x",input.getString("a")); 
output.put("y",input.getJSONObject("b").getString("b1")); 
output.put("z",input.getJSONObject("c").getJSONObject("c2").getString("c22")); 

是否有某种“正则表达式”,这将有助于我的在“一杆”中实现这一点?

对于给定示例的答案将不胜感激。

感谢

+0

你有没有考虑使用谷歌GSON库? – Alessio

+0

我还没有,但我宁愿“尽可能少地导入”。这个库会来**而不是我已经使用的JSON库,或**此外**?谢谢。 –

回答

1

一种替代的方法是使用JSON in Java框架来改变你的JSON对象转换为Java,执行操作,并且产生新的JSON对象。

编辑:对不起,误会。

你应该真的去一个框架,如推荐的一个或@Alessio。虽然这应该可能通过使用正则表达式,个人,我会建议它,因为您正在寻找的嵌套和/或对象的变化可能会导致正则表达式本身的重大变化。因此,虽然正则表达式可以更快地完成工作,但它可能不具有可读性和可维护性。

+0

谢谢。我**我**使用'JSONObject'类(假设这就是你的意思)。我手动逐个提取字段,并且我认为可能存在某种“正则表达式”,这会帮助我在“一次性”中实现它。 –

+0

@barakmanos:抱歉误会,我更新了我的答案,以更好地回答你的问题。 – npinti

+0

谢谢;这对我来说很有意义,因为我认为正确的表达对我来说很难在未来继续保持;将等待,看看是否有更多的答案出现,并会接受你的,如果没有更好的意见提供。再次感谢:) –

1

有一些框架,可能会帮助你实现你正在寻找的东西。问题在于,对于像这样的简单工作,它们太复杂了。

您可能会看到Apache Camel,YQL,QL.IO, Teiid,Stardust。它们都是用于不同级别数据虚拟化/集成的框架,并且可以完成这项工作。问题在于你是否真的需要这样的基础设施,以及你有多少数据转​​换?

如果您只有此转换,那么我会建议您使用GSONApache Camel

1

您可以使用JsonPath来避免低级别的JSONObject API调用。

添加maven的依赖性:

<dependency> 
    <groupId>com.jayway.jsonpath</groupId> 
    <artifactId>json-path</artifactId> 
    <version>2.2.0</version> 
</dependency> 

解析从字符串/文件/ URL /的InputStream您的JSON:

DocumentContext doc = JsonPath.parse(String|File|URL|InputStream data); 

然后你就可以使用任意的点或关键符号,取其你喜欢:

String title = doc.read("$.store.book[0].title"); 

String title = doc.read("$['store']['book'][0]['title']"); 

与XPath中的//类似,您可以使用..来获取树中任何位置的子节点。

该API还允许在DocumentContext中映射和重命名元素。

查看更多: