JSON / Jackson输出在每个节点上意外地添加了一个“父”元素

时间:2019-06-26 18:05:36

标签: java json jackson

我正在使用Java 12 / Jacskon 2.9.9进行“读取”和“写入”,其中包含非常简单的JSON数组。

我正在将其读入可以完美运行的地图。

问题是,编写更新的Map时,我得到一个外部元素,该元素导致一些嵌套并破坏了我的代码。

原始JSON

 [
        {
            "puid": "sys1",
            "host": "127.0.0.1",
            "syst": "U",
            "user": "xxxx",
            "pass": "secret"
        },
        {
            "puid": "sys2",
            "host": "myhost",
            "syst": "U",
            "user": "yyyy",
            "pass": "secret2"
        },
        {
            "puid": "sys3",
            "host": "localhost",
            "syst": "U",
            "user": "zzzz",
            "pass": "secret3"
        }
    ]

我正在将此文件读取到一个List <>中,该列表运行得很好。我可以使用此列表来做有意义的事情。

这个想法是,通过API调用,我提供了一个类似的JSON元素,它使用以下格式的新元素和现有元素重写了整个文件。

但是... 它是这样写的-带有外部"sys1""sys2""sys3"元素/节点。

更新的JSON

 {
      "sys1" : {
        "puid" : "sys1",
        "host" : "127.0.0.1",
        "syst" : "U",
        "user" : "xxxx",
        "pass" : "secret"
      },
      "sys2" : {
        "puid" : "sys2",
        "host" : "myhost",
        "syst" : "U",
        "user" : "yyyy",
        "pass" : "secret2"
      },
     "sys3" : {
        "puid" : "sys3",
        "host" : "localhost",
        "syst" : "U",
        "user" : "zzzz",
        "pass" : "secret3"
      },
    }

这可能是编写它的正确方法,但是不幸的是,我无法控制给出的JSON文件的格式。它们采用原始格式,显示在上方。

我尝试了几项都无济于事。我已经尝试了几次网络搜索,但实际上并不知道在搜索栏中输入什么(因此,这个更详细的问题)。

此时此刻,我已将代码放回到这一简单的行中,并根据SO的建议进行修复:)

String json = new ObjectMapper( ).writerWithDefaultPrettyPrinter( ).writeValueAsString( map );

更新

为昨晚我的含糊而道歉,我很累。

但是,现在我根据以下迈克尔的回答有了一个可行的解决方案。使用列表,而不是地图。

如果有人遇到此问题(或供我将来参考),请在此处修改和工作代码

  List<Object> jsonList = new ArrayList<Object>( map.values( ) );
  ObjectMapper mapper = new ObjectMapper( );
  String jsonOutput = mapper.writerWithDefaultPrettyPrinter( ).writeValueAsString( jsonList );

1 个答案:

答案 0 :(得分:1)

Map始终转换为JSON对象,而不转换为JSON数组。所以您的结果是预期的。如果您想要原始的JSON格式,则应将数据转换为List<Map<String, Object>>List<Map<String, String>>,然后您将获得原始格式