【问题标题】:Convert values from json string to object将值从 json 字符串转换为对象
【发布时间】:2020-07-28 11:42:26
【问题描述】:

我有一个JSON 格式的有效负载,每个值都是一个带有单个地图元素的列表:

{
  "redundant_str_1": [
    {
      "attr_1": "val1",
      "attr_2": "val2"
    }
  ],
  "rendundant_str_2": [
    {
      "attr_1": "val4",
      "attr_2": "val3"
    }
  ]
}

型号是:

public class MyObj {

     private String attr_1;
     private String attr_2;
}

如何通过忽略键并仅从列表中获取元素来将上述响应映射到 List<MyObj>

【问题讨论】:

  • 您也可以将 json 转换为 List of HashMap
  • 法萨的好主意

标签: java json jackson deserialization json-deserialization


【解决方案1】:
String json = "{\"redundant_str_1\": [{\"attr_1\": \"val1\", \"attr_2\": \"val2\"}], \"rendundant_str_2\": [{\"attr_1\": \"val4\", \"attr_2\": \"val3\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
List<MyObj> myObjList = new ArrayList<>();

ObjectNode objectNode = (ObjectNode) objectMapper.readTree(json);
    for (Iterator<JsonNode> it = objectNode.elements(); it.hasNext(); ) {
        ArrayNode arrayNode = (ArrayNode) it.next();
        MyObj myObj = objectMapper.treeToValue(arrayNode.get(0),MyObj.class);
        myObjList.add(myObj);
    }
System.out.println("List : " + myObjList);

输出:

   List : [MyObj{attr_1='val1', attr_2='val2'}, MyObj{attr_1='val4',attr_2='val3'}]

【讨论】:

    【解决方案2】:

    你可以使用Jackson(添加依赖到jackson-corejackson-databind):

      String json = "[" +
                    "{\"attr_1\": \"val1\", \"attr_2\": \"val2\"}, " +
                    "{\"attr_1\": \"val4\", \"attr_2\": \"val3\"}"
                    + "]";
    
      ObjectMapper mapper = new ObjectMapper();
      mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
      List<MyObj> list = Arrays.asList(mapper.readValue(json, MyObj[].class));
    

    或者,如果您在字段上添加 MyObj 设置器或将它们公开,则不需要该行:

    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    

    【讨论】:

      【解决方案3】:

      您的回复格式为Map&lt;String, List&lt;MyObj&gt;&gt;。您可以将其反序列化为给定类型,然后转换为List&lt;MyObj&gt;

      import com.fasterxml.jackson.core.type.TypeReference;
      import com.fasterxml.jackson.databind.ObjectMapper;
      import com.fasterxml.jackson.databind.json.JsonMapper;
      import lombok.Data;
      import lombok.ToString;
      
      import java.io.File;
      import java.io.IOException;
      import java.util.Collection;
      import java.util.List;
      import java.util.Map;
      import java.util.stream.Collectors;
      
      public class MyObjApp {
          public static void main(String[] args) throws IOException {
              File jsonFile = new File("./resource/test.json").getAbsoluteFile();
      
              ObjectMapper mapper = JsonMapper.builder().build();
              TypeReference<Map<String, List<MyObj>>> respType = new TypeReference<Map<String, List<MyObj>>>() {};
              Map<String, List<MyObj>> response = mapper.readValue(jsonFile, respType);
      
              List<MyObj> myObjs = response.values().stream().flatMap(Collection::stream).collect(Collectors.toList());
              System.out.println(myObjs);
          }
      }
      
      @Data
      @ToString
      class MyObj {
      
          private String attr_1;
          private String attr_2;
      }
      

      上面的代码打印:

      [MyObj(attr_1=val1, attr_2=val2), MyObj(attr_1=val4, attr_2=val3)]
      

      【讨论】:

        猜你喜欢
        • 2019-08-27
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 2012-06-14
        • 2012-02-20
        • 2015-01-03
        相关资源
        最近更新 更多