【问题标题】:Add a property at a specific position to a json string with jackson json使用jackson json将特定位置的属性添加到json字符串
【发布时间】:2016-09-02 19:35:55
【问题描述】:

我知道如何使用带有ObjectNode.put() 的jackson 添加属性,但是有没有办法在特定位置插入属性? 例如,如果我有这个 JsonNode:

{
    "property1":"val1",
    "property2":"val2",
    "property3":"val3"
}

我想要的是:

{
    "property1":"val1",
    "property4":"val4",
    "property2":"val2",
    "property3":"val3"
}

我怎样才能通过 Jackson 实现这一目标?

【问题讨论】:

  • 对象属性顺序应该无关紧要。你为什么在乎?
  • 我正在解析一个 json 文件,我想在特定位置添加一个属性然后回写。这可能吗?
  • 为什么要关心具体的“职位”?为什么重要?
  • 这个文件是用来配置的,格式很好,不想弄乱。
  • 节点很大还是可以复制?

标签: java json jackson


【解决方案1】:

JSON 规范不要求对对象进行排序(它们可能取决于实现,也可能不取决于实现),因此您不应依赖它。然而,数组是明确排序的:

6 个对象

对象结构表示为一对围绕零个或多个名称/值对的花括号标记。一种 名称是一个字符串。每个名称后面都有一个冒号标记, 将名称与值分开。单个逗号标记 将值与后面的名称分开。

7 个数组

数组结构是一对方括号 围绕零个或多个值的标记。值是 被逗号隔开。值的顺序很重要。

(来自http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

【讨论】:

  • 哦,好吧,现在我发现属性的顺序并不重要。我要做的是读取一个 json 格式的文件,在特定位置添加一些属性,写回并保存文件。该文件格式良好,用于配置,我不想让它乱七八糟,所以我想把属性整理一下。
  • 文件大约37MB,复制一下应该没问题。
  • 我只是在想,因为杰克逊在内部使用LinkedHasMap,所以每次你想在其他地方插入而不是在末尾时,你都可以重新填充整个对象。但是,37 MB 并不是那么小,而且效率低下。顺便说一句,它可能会在下一版本的 Jackson 或使用另一个 JSON 库时停止工作。说了这么多,我不推荐。也许 JSON 不是你想要的格式,或者你需要数组而不是对象
【解决方案2】:

使用ObjectMapper 并使用@JsonPropertyOrder(alphabetic=true) 或明确指定的顺序。

【讨论】:

  • 哦,很好,我想ObjectMapper是我想要的,我试试看,谢谢!
  • 这很好,但假设他的配置保存在单个类中,情况可能并非如此,例如可能只是数据。在这种情况下,他将不得不编写一个 100% 样板类,这可能是可以接受的,但可以说不是很好
  • 嗨,马特,是否可以在没有序列化的情况下处理它?明确地说,我要做的是读取一个json文件,插入一个属性然后写回文件。
  • “没有序列化”是什么意思?将文件写成 JSON序列化。
  • 嗯...好吧,据我了解,如果我想回信,我需要创建类来处理数据。真的吗?例如,如果我有一个汽车对象,我需要一个汽车类来处理数据,然后修改数据并写回文件。我可以只修改没有这些类的 json 文件吗?
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多