用杰克逊读杰森

时间:2017-01-23 21:34:41

标签: java json jackson

我在阅读这个json时遇到了问题,但代码似乎有效,但有2个问题

  1. 它只读取json的一个块,而不是完全。
  2. 它始终有" null"作为属性中的值。
  3. 我一直试图在控制台中展示json,但是当我尝试这两件事情时。

    JSON数据示例:

    {
      "RestResponse" : {
        "messages" : [ "More webservices are available at http://www.groupkt.com/post/f2129b88/services.htm", "Total [249] records found." ],
        "result" : [ {
          "name" : "Afghanistan",
          "alpha2_code" : "AF",
          "alpha3_code" : "AFG"
        }, {
          "name" : "Åland Islands",
          "alpha2_code" : "AX",
          "alpha3_code" : "ALA"
        }, {
          "name" : "Albania",
          "alpha2_code" : "AL",
          "alpha3_code" : "ALB"
        }, ...
        ]
      }
    }
    

    我的代码:

    public class jsonController {
    
    public void run() {
        ObjectMapper mapper = new ObjectMapper();
        try {
    
            jsonHandler obj = mapper.readValue(new URL("http://services.groupkt.com/country/get/all"), jsonHandler.class);
            //Organized Print
            String organizedprint = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
            System.out.println(organizedprint);
    
    
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    主要是我有

    jsonController obj = new jsonController();
        obj.run();
    

    这里是jsonHandler

    @JsonIgnoreProperties(ignoreUnknown=true)
    public class jsonHandler {
        private String restResponse;
        private String messages;
        private String result;
        private String name;
        private String alpha2;
        private String alpha3;
    }
    

    知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

您在模型中错误地声明了数据类型。您的Java代码声明数据将包含一个包含6个字符串属性的对象。服务器提供的JSON数据完全不同。例如,messages是字符串列表,result是对象列表,而不是字符串。您需要相应地声明您的Java模型。

例如:

public class jsonHandler
    {
    private RestResponseStructure restResponse;
    }

public class RestResponseStructure
    {
    private List<String> messages;
    private List<CountryRecord> results;
    }

public class CountryRecord {
    private String name;
    private String alpha2_code;
    private String alpha3_code;
}

答案 1 :(得分:0)

好的映射类jsonHandler是错误的。首先,它应该正确地大写(JsonHandler

使用http://www.jsonschema2pojo.org/我生成了更好的模型。它由3个类组成。只需更改包&#34; com.example&#34;对你的。

package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"RestResponse"
})
public class JsonHandler {

@JsonProperty("RestResponse")
private RestResponse restResponse;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("RestResponse")
public RestResponse getRestResponse() {
return restResponse;
}

@JsonProperty("RestResponse")
public void setRestResponse(RestResponse restResponse) {
this.restResponse = restResponse;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

<强> com.example.RestResponse.java

package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"messages",
"result"
})
public class RestResponse {

@JsonProperty("messages")
private List<String> messages = null;
@JsonProperty("result")
private List<Result> result = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("messages")
public List<String> getMessages() {
return messages;
}

@JsonProperty("messages")
public void setMessages(List<String> messages) {
this.messages = messages;
}

@JsonProperty("result")
public List<Result> getResult() {
return result;
}

@JsonProperty("result")
public void setResult(List<Result> result) {
this.result = result;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

<强> com.example.Result.java

package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"alpha2_code",
"alpha3_code"
})
public class Result {

@JsonProperty("name")
private String name;
@JsonProperty("alpha2_code")
private String alpha2Code;
@JsonProperty("alpha3_code")
private String alpha3Code;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("name")
public String getName() {
return name;
}

@JsonProperty("name")
public void setName(String name) {
this.name = name;
}

@JsonProperty("alpha2_code")
public String getAlpha2Code() {
return alpha2Code;
}

@JsonProperty("alpha2_code")
public void setAlpha2Code(String alpha2Code) {
this.alpha2Code = alpha2Code;
}

@JsonProperty("alpha3_code")
public String getAlpha3Code() {
return alpha3Code;
}

@JsonProperty("alpha3_code")
public void setAlpha3Code(String alpha3Code) {
this.alpha3Code = alpha3Code;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}