【问题标题】:Formatting Json Response into an Array Java将 Json 响应格式化为数组 Java
【发布时间】:2020-11-22 23:35:52
【问题描述】:

目前我从我的 API 收到这样的响应:

[{"$id":"1","accommodation_type":"apartment","max_people":2},{"$id":"2","accommodation_type":"lodge","max_people":5}]

我想对其进行格式化,以便输出删除所有不必要的标点符号,使其看起来更像这样,同时将其放入数组中。

id, 1, accommodation_type, apartment, max_people, 2, id, 2, accommodation_type, lodge, max_people 5

1, apartment, 2, ,2, lodge, 5

目前我已经尝试过:

String temp[]= AccommodationTypesStr.split(":|\\,|\\}"); // Where AccommodationTypesStr is the input json string

但是,在每行数据之间,它会在数组中留下一个空白空间作为元素,因此如下所示:

id, 1, accomodation_type, apartment, max_people, 2,  ,id, 2, accommodation_type, lodge, max_people 5

虽然在响应中仍然有一些括号。

我弄乱了 JSON 对象和数组,但一点运气都没有,所以想知道我是否可以通过自己格式化来做到这一点。

【问题讨论】:

    标签: java arrays json


    【解决方案1】:

    您可以创建一个 POJO 类,然后使用 Jackson 或 Gson 等库将 JSON 字符串映射到 POJO 实例数组。在这种情况下,我将使用 Jackson,您可以通过 maven 将其导入:

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.11.0</version>
    </dependency>
    

    POJO 类。请注意,我使用注解 @JsonProperty 来设置 JSON 字段名称,这样我就可以避免使用包含特殊字符的变量名称。

    import com.fasterxml.jackson.annotation.JsonProperty;
    
    public class APIResponse {
    
        @JsonProperty("$id")
        private int id;
    
        @JsonProperty("accommodation_type")
        private String accommodationType;
    
        @JsonProperty("max_people")
        private int maxPeople;
    
        public int getId() {
            return id;
        }
    
        public int getMaxPeople() {
            return maxPeople;
        }
    
        public String getAccommodationType() {
            return accommodationType;
        }
    
        @Override
        public String toString() {
            return "APIResponse{" +
                    "id=" + id +
                    ", accommodationType='" + accommodationType + '\'' +
                    ", maxPeople=" + maxPeople +
                    '}';
        }
    }
    

    然后你可以反序列化使用:

    final String json = "[{\"$id\":\"1\",\"accommodation_type\":\"apartment\",\"max_people\":2},{\"$id\":\"2\",\"accommodation_type\":\"lodge\",\"max_people\":5}]";
    final ObjectMapper mapper = new ObjectMapper();
    APIResponse[] responses = mapper.readValue(json, APIResponse[].class);
    for (APIResponse response: responses) {
        System.out.println(response.toString());
    }
    

    结果:

    APIResponse{id=1, accommodationType='apartment', maxPeople=2}
    APIResponse{id=2, accommodationType='lodge', maxPeople=5}
    

    最后,您只需调用 POJO 类中的 getter 即可访问数据:

    responses[0].getId(); // 1
    responses[1].getAccommodationType; // lodge
    

    如果你想用逗号分隔数据,请使用:

    public String[] getByComas(APIResponse[] responses) {
        List<String> data = new ArrayList<>();
        for (APIResponse response: responses) {
            data.add("id,");
            data.add(response.getId() + ",");
            data.add("accommodation_type,");
            data.add(response.getAccommodationType() + ",");
            data.add("max_people,");
            data.add(response.getMaxPeople() + ",");
        }
        return data.toArray(new String[data.size()]);
    }
    

    然后只需使用:

    String[] formattedMessage = getByComas(responses);
    for (String s: formattedMessage) {
        System.out.print(s);
    }
    

    结果:

    id,1,accommodation_type,apartment,max_people,2,id,2,accommodation_type,lodge,max_people,5,
    

    强烈建议使用 JSON 映射器,因为它们在解析 JSON 数据时非常可靠。

    如果这能解决您的问题,请告诉我!

    【讨论】:

      【解决方案2】:

      您可以使用ObjectMapperjson 字符串转换为某个对象,例如List&lt;Map&lt;String, Object&gt;&gt;。然后使用java stream api 遍历这个列表。

      Maven 依赖:

      <dependency>
          <groupId>com.fasterxml.jackson.dataformat</groupId>
          <artifactId>jackson-dataformat-xml</artifactId>
          <version>2.11.1</version>
      </dependency>
      

      读取json字符串值:

      String json = "[{\"$id\":\"1\",\"accommodation_type\":\"apartment\",\"max_people\":2},{\"$id\":\"2\",\"accommodation_type\":\"lodge\",\"max_people\":5}]";
      ObjectMapper mapper = new ObjectMapper();
      List<Map<String, Object>> list = mapper.readValue(json, List.class);
      

      然后遍历这个列表:

      List<Object> flatList = list.stream()
          .flatMap(element -> element.values().stream())
          .collect(Collectors.toList());
      
      System.out.println(flatList); // [1, apartment, 2, 2, lodge, 5]
      

      或更详细的变体:

      List<Object> flatList = list.stream()
          .map(Map::values)
          .collect(Collectors.toList());
      
      System.out.println(flatList); // [[1, apartment, 2], [2, lodge, 5]]
      

      还有更多:

      List<Object> flatList = list.stream()
          .flatMap(element -> element.entrySet().stream())
          .flatMap(entry -> Stream.of(
              entry.getKey().replace("$", ""), // without "$"
              entry.getValue()))
          .collect(Collectors.toList());
      
      System.out.println(flatList);
      // [id, 1, accommodation_type, apartment, max_people, 2, id, 2, accommodation_type, lodge, max_people, 5]
      

      一般来说,您可以编写自己的展平算法。例如:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        相关资源
        最近更新 更多