【问题标题】:how to update the json with map values using java?如何使用 java 用地图值更新 json?
【发布时间】:2021-02-01 21:34:42
【问题描述】:

我有以下 json:

{
"type":Flowers,
"input_data": [
    {
      "id": 35742,
      "Request_ID": 8383,
      "data_line": "*****Sample text here*****",      
      "variety": {
        "Rose": 0,
        "Jasmine": 0,
        "Lily": 1,
        "Sunflower": 1,       
      },
      
      "responded": 1
    },
{
      "id": 35992,
      "Request_ID": 8983,
      "data_line": "*****Sample text here*****",      
      "variety": {
        "Rose": 1,
        "Jasmine": 0,
        "Lily": 0,
        "Sunflower": 1,       
      },
      
      "responded": 1
    }
 
  ],
  "token": "F9500930C-15A6-4111-AD7F-7D0DF0CEE4D8"
}

如何将“variety”中的值映射到“id”?

注意:id 来自不同 API 的响应,应在此 json 中替换它并映射为各种类型。

【问题讨论】:

标签: java json mapping


【解决方案1】:

在你的 json 中有一个像“input_data”这样的字段不是一个好主意。

尝试重做与您的数据模型对齐的 json 以及可以映射到 Java 对象的内容。

GSON 是一个很棒的库,用于处理 Java 中的 JSON - https://github.com/google/gson

我可以给你一个实用方法来从 json 表示中获取 Java 对象列表,如下所示:

private static Type typeOfT = TypeToken.getParameterized(List.class, <<your-class>>.class).getType();

public static <T> List<T> loadListFromFile(String fileName, Class<T> clazz) throws Exception{

File file = new File(fileName);
String json = new String(Files.readAllBytes(file.toPath()));
return gson().fromJson(json, typeOfT);
}

【讨论】:

    【解决方案2】:

    首先,您的 JSON 字符串无效(例如,Flowers 应该用双引号引起来)。其次,我对你真正想要什么感到困惑。因此,根据您问题下的评论,您说您需要idvariety 之间的映射。这里有一种方法可以通过使用Jackson(最流行的 JSON 库之一。)来实现。

    第 1 步
    为反序列化创建嵌套 POJO。

    class Result {
        @JsonProperty("input_data")
        private List<InputData> inputData;
    
        //general getter and setter
    }
    
    class InputData {
        private int id;
        private Variety variety;
    
        //general getters and setters
    }
    
    class Variety {
        @JsonProperty("Rose")
        private int rose;
         
        @JsonProperty("Jasmine")
        private int jasmine;
         
        @JsonProperty("Lily")
        private int lily;
         
        @JsonProperty("Sunflower")
        private int sunflower;
    
        //general getters, setters and toString()
    }
    

    第 2 步
    将 JSON 响应反序列化为 Result,并使用 Java 8 将 InputData 转换为 Map&lt;Integer, Variety&gt;

    ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    Result result = mapper.readValue(jsonStr, Result.class);
             
    Map<Integer, Variety> idVarietyMap = result.getInputData().stream()
        .collect(Collectors.toMap(InputData::getId, InputData::getVariety));
    System.out.println(idVarietyMap.toString());
    

    控制台输出

    {35992=Variety [rose=1, jasmine=0, lily=0, sunflower=1], 35742=Variety [rose=0, jasmine=0, lily=1, sunflower=1]}
    

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 2021-04-12
      • 2021-09-03
      • 2012-01-20
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2021-12-19
      相关资源
      最近更新 更多