使用顺序属性打印JSON

时间:2018-09-04 13:28:16

标签: java json jackson

我有按特定顺序排列的JSON对象:

{
  "Aaa": {
    "Langs": {
      "Val": [
        "Test"
      ],
      "Pro": [
        "Test2"
      ]
    }
  },
  "Bbb": {
    "Langs": {
      "Val": [
        "Test"
      ],
      "Pro": [
        "Test2"
      ]
    }
  },
  "Ddd": {
    "Langs": {
      "Val": [
        "Test"
      ],
      "Pro": [
      ]
    }
  },
}

我想在CccBbb之间添加新对象Ddd。我试图像这样配置对象映射器:

ObjectMapper mapper = new ObjectMapper()
        .enable(SerializationFeature.INDENT_OUTPUT)
        .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
        .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);

然后使用此代码打印,但是Ccc在文件末尾结束。

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

//Write whole JSON in FILE
String finalJson = mapper.writer(prettyPrinter).writeValueAsString(rootFlores);
finalJson = finalJson.replaceAll("\\[ ]", "[" + System.lineSeparator() + "      ]");
finalJson = finalJson.replaceAll("/", "\\\\/");

Files.write(Paths.get("DictionaryFlores_new.json"), Collections.singleton(finalJson));

这是一种如何打印JSON排序的方法吗?

3 个答案:

答案 0 :(得分:1)

Jackson deserialization/serialization does not sort properties

根据此答案,Jackson SORT_PROPERTIES_ALPHABETICALLY仅适用于POJO属性,不适用于Maps。在JSON中,地图和对象之间没有区别,因此您需要先使用LinkedHashMap或TreeMap在地图中设置顺序

答案 1 :(得分:0)

根据定义,对象的键是无序的。我猜有些库可以提供一个选项,用于在字符串化时控制键的顺序,但我不会指望它。

当您需要json中的特定顺序时,您需要使用一个数组。当然,然后您必须将键移到子对象的属性中,然后只能按数字(而不是键)对结果数组进行索引。因此,您可能需要做一些额外的处理,才能将JSON中的数据结构转换为您真正要处理的数据结构。

答案 2 :(得分:0)

由于您似乎已准备好使用正则表达式来更新JSON,因此建议您使用“更安全”的方法。请勿尝试创建无法确定您不会在某处更新值的模式。

在对象上迭代您的值。字符串化对象,然后自己附加字符串。这样,您将负责对象顺序。示例:

StringBuilder sb = new StringBuilder("{");
List<JsonPOJO> list = new ArrayList<>();
//populate the list
for(JsonPOJO pojo : list){
    sb.append(pojo.stringify()).append(","); 
}
sb.setLength(sb.length() - 1); //remove the last commma
sb.append("}");

在这里,您仅管理每个JSON对象之间的逗号,而不创建有关JSON的“复杂”部分。而且您完全可以控制String表示形式中值的顺序,这仅取决于填充List的方式。

注意:对“草稿”代码很抱歉,我在这里实际上没有访问我的系统的权限,因此只需编写此代码段,即可基本了解如何“管理” JSON,而不必完全重新创建API

注意2:除非有必要,否则我建议这样做。正如您在评论中提到的那样,您只有一个键的问题,即您已经拥有一个具有80000个键的JSON,所以我想这是一个“倒霉”的情况,要求最后的解决方案;)