0

爪哇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"));

是否有某种“正则表达式”可以帮助我“一次性”实现这一目标?

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

谢谢

4

3 回答 3

1

有一些框架可以帮助您实现您正在寻找的东西。问题是它们对于像这样的简单工作来说太复杂了。

你可以看看Apache CamelYQLQL.IOTeiidStardust。它们都是不同级别的数据虚拟化/集成框架,可以完成这项工作。问题是您是否真的需要这样的基础架构以及您真正拥有多少数据转​​换?

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

于 2014-01-29T09:11:55.217 回答
1

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

编辑:很抱歉造成误解。

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

于 2014-01-29T08:39:44.507 回答
1

您可以使用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 中映射和重命名元素。

看更多:

于 2017-02-20T11:49:28.507 回答