【问题标题】:Simplest way to convert this array in to the specified one using Java使用 Java 将此数组转换为指定数组的最简单方法
【发布时间】:2021-12-19 10:39:43
【问题描述】:

我有这个字符串 Json 有效负载

[
   "key1":{
      "atr1":"key1",
      "atr2":"value1",
      "atr3":"value2",
      "atr4":"value3,
      "atr5":"value4"
   },
   "key2":{
      "atr1":"key2",
      "atr2":"value5",
      "atr3":"value6",
      "atr4":value7,
      "atr5":"value8"
   }
]

我希望使用 Java 将其转换为以下格式

[
  {
      "atr2":"value1",
      "atr3":"value2",
      "atr4":"value3,
      "atr5":"value4"
   },
  {
      "atr2":"value5",
      "atr3":"value6",
      "atr4": "value7",
      "atr5":"value8"
   }
]

最简单的转换方法是什么?

【问题讨论】:

  • value7 不是有效的 json 值。你是说"value7" 还是7
  • 要删除"atr1":"key1""atr1":"key2" 吗?
  • 应该是 "value7" 抱歉我修好了
  • 是的,它也需要删除
  • @CharithJayasanka 不,你没有修复它。请再次检查。

标签: java arrays json string performance


【解决方案1】:

假设您将 JSON 更正为一个有效的 JSON(包括用花括号替换周围的方括号,并正确地将属性值括在引号中),这是一种更简单的方法,只涉及几行核心逻辑。

try{
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false );
    HashMap<String, Data> map = mapper.readValue( jsonString, new TypeReference<HashMap<String, Data>>(){} );
        
    String json = mapper.writeValueAsString( map.values() );
    System.out.println( json );
}
catch( JsonProcessingException e ){
    e.printStackTrace();
}
  • 上面的jsonString 是您的原始 JSON 更正且有效的 JSON 输入。
  • 还要注意将FAIL_ON_UNKNOWN_PROPERTIES 设置为false 以允许在反序列化为Data 时忽略atr1

由于我们完全抛弃了attr1 及其值,Data 类将代表除此之外的所有字段。

private static class Data{
    private String atr2;
    private String atr3;
    private String atr4;
    private String atr5;
}

【讨论】:

    【解决方案2】:

    您不能,因为下面的示例不是有效的json。 使用这个 JSON 验证器检查一下。

    如果你把它粘贴进去(我已经修复了一些缺少引号的基本错误)

    {
      {
          "atr2":"value1",
          "atr3":"value2",
          "atr4":"value3",
          "atr5":"value4"
       },
      {
          "atr2":"value5",
          "atr3":"value6",
          "atr4":"value7",
          "atr5":"value8"
       }
    }
    

    你会得到这些错误...

    如果您通过使用json-array 将目标架构更改为类似的内容来包含您的数据,则它可以工作。

    [
      {
          "atr2":"value1",
          "atr3":"value2",
          "atr4":"value3",
          "atr5":"value4"
       },
      {
          "atr2":"value5",
          "atr3":"value6",
          "atr4":"value7",
          "atr5":"value8"
       }
    ]
    

    如果这对您有用,那么使用 ObjectMapper 类可以轻松解决此问题。

    1. 您使用它将原始 JSON 反现实化为一个类,该类具有“key1”和“key2”两个字段
    2. 提取这些字段的值,然后将它们存储在一个数组中...
    3. 使用ObjectMapper 序列化数组。

    这里是link,它解释了如何使用ObjectMapper 类来实现上述目标。

    编辑:

    所以你需要以下类来解决问题...

    存储对象数据

    class MyClass {
       String atr2;
       String art3;
    }
    

    那么你就有了一个容器类,用来存放初始的json。

    class MyClassContainer {
      MyClass key1;
      MyClass key2;
    }
    

    这是从原始 json 解析到 MyClassContainer 的方法

    var mapper = new ObjectMapper()
    var json = //Get the json String somehow
    var myClassContainer =  mapper.readValue(json,MyClassContainer.class)
    var mc1 = myClassContainer.getKey1();
    var mc2 = myClassContainer.getKey2();
    var myArray = {key1, key2}
    var resultJson = mapper.writeValueAsString(myArray)
    

    【讨论】:

    • 至少转换成数组没问题
    • 酷。然后 ObjectMapper 会做你想做的一切。
    • 我已将其编辑到一个数组中
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2011-10-03
    • 2011-10-03
    • 2010-12-23
    • 2016-11-06
    • 2012-02-05
    相关资源
    最近更新 更多