【问题标题】:How to parse json to object如何将json解析为对象
【发布时间】:2020-06-10 05:49:12
【问题描述】:

我想创建一个包含一个字段的对象:List

public class Responce {

List<String> cities 

// some methods

}

JSON 本身看起来是这样的(它在对象中有一个对象):

{"responce" : {
   "list" : {
    "1": "А",
    "2": "B",
    "3": "C",
      .....  
    }
  }

我只想获取 A、B、C 的列表以及所有这些,而不需要创建大量的类:)

我已经尝试过 JsonNons 和 @JsonPropery,但到目前为止还没有运气。

【问题讨论】:

  • 您的问题陈述不是很清楚。您共享的 json 与您的对象不匹配。到目前为止你尝试过什么?
  • 我的意思是只将值 (A,B,C...) 放入 List 城市

标签: java json parsing


【解决方案1】:

我没有得到你的问题,但如果你需要反序列化 json 数据,那么你可以试试这个。

为 List 创建一个 pojo 类

public class cityListPojo{

   private List<String> cityList;

   public List<String> getCityList() {
       return cityList;
   }

   public void setCityList(List<String> cityList) {
       this.cityList = cityList;
   }
}

然后使用jackson库,您可以将收到的json字符串转换为cityListPojo类对象

// jsonString:- 从 db 或任何你得到的地方获取 json 并将其转换为字符串。

cityListPojo obj = new ObjectMapper().readValue(jsonString, cityListPojo.class);

然后使用 obj 对象将 List 返回为。

List<String> cityList = obj.getCityList();

// 这些jackson依赖仅供参考。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>

【讨论】:

    【解决方案2】:

    如下设置城市,

    Response.java

    public class Response {
    
        @JsonProperty
        private Map<String, String> list;
    
        @JsonIgnore
        List<String> cities = new ArrayList<>();
    
        public Map<String, String> getList() {
            return list;
        }
    
        public void setList(Map<String, String> list) {
            Set<String> keys = list.keySet();
            for (String key : keys) {
                cities.add(list.get(key));
            }
            this.list = list;
        }
    
        public List<String> getCities() {
            return cities;
        }
    
        public void setCities(List<String> cities) {
            this.cities = cities;
        }
    }
    

    测试方法

        public static void main(String... args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
    
            String json = " {\r\n" + 
                    "   \"list\" : {\r\n" + 
                    "    \"1\": \"А\",\r\n" + 
                    "    \"2\": \"B\",\r\n" + 
                    "    \"3\": \"C\",\r\n" + 
                    "    \"4\":\"D\",\r\n" + 
                    "    \"5\":\"E\"\r\n" + 
                    "    }\r\n" + 
                    "  }";
    
            Response response = mapper.readValue(json, Response.class);
    
            System.out.println("Object:" + mapper.writeValueAsString(response));
    
            System.out.println("Cities:");
            for (String city : response.getCities()) {
                System.out.print("\t" + city);
            }
        }
    

    可以使用自定义序列化器

    Response.java

    @JsonSerialize(using = ResponseSerializer.class)
    public class Response {
    
        private Map<String, String> list;
    
        List<String> cities = new ArrayList<>();
    
        public Map<String, String> getList() {
            return list;
        }
    
        public void setList(Map<String, String> list) {
            this.list = list;
        }
    
        public List<String> getCities() {
            return cities;
        }
    
        public void setCities(List<String> cities) {
            this.cities = cities;
        }
    }
    
    

    ResponseSerializer.java

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    
    public class ResponseSerializer extends StdSerializer<Response> {
    
        public ResponseSerializer() {
            this(null);
        }
    
        public ResponseSerializer(Class<Response> t) {
            super(t);
        }
    
        @Override
        public void serialize(Response value, JsonGenerator jgen, SerializerProvider provider)
                throws IOException, JsonProcessingException {
    
            jgen.writeStartObject();
    
            Map<String, String> list = value.getList();
    
            List<String> cities = new ArrayList<>();
            Set<String> keys = list.keySet();
            for (String key : keys) {
                cities.add(list.get(key));
            }
            jgen.writeObjectField("cities", cities);
            jgen.writeEndObject();
        }
    }
    

    测试方法

    public static void main(String... args) throws Exception {
            ObjectMapper mapper1 = new ObjectMapper();
            Response response1=new Response() ;
    
            Map<String, String> map=new HashMap<>();
    
            map.put("1", "A");      
            map.put("2", "B");
            map.put("3", "C");
    
            response1.setList(map);
    
            System.out.println("Object:" +  mapper1.writeValueAsString(response1));
    
            System.out.println("Cities:");
            for (String city : response1.getCities()) {
                System.out.print("\t" + city);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多