繁体   English   中英

在Java中将JSON对象转换为另一个JSON对象

[英]Convert a JSON object to another JSON object in Java

Java class JSONObject

我有一个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"));

是否有某种“正则表达式”可以帮助我“一次完成”?

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

谢谢

一种替代方法是在Java框架中使用JSON将JSON对象转换为Java,执行操作并生成新的JSON对象。

编辑:抱歉造成误会。

您确实应该选择一个推荐的框架,例如@或@Alessio。 尽管这应该可以通过使用正则表达式来完成,但就个人而言,我还是建议要这样做,因为您要查找的嵌套和/或对象的更改可能会导致正则表达式本身发生很大的更改。 因此,尽管正则表达式可以更快地完成工作,但它可能不那么易读和可维护。

有一些框架可以帮助您实现所需的目标。 问题在于它们对于像这样的简单工作来说太复杂了。

您可以看看Apache CamelYQLQL.IOTeiidStardust 它们都是用于不同级别的数据虚拟化/集成的框架,并且可以完成任务。 问题是,您是否真的需要这样的基础架构?您真正拥有多少个数据转换?

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

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

添加Maven依赖项:

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

从String / File / 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中映射和重命名元素。

查看更多:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM