Jackson JSON无法构造“关于”的实例:反序列化问题

时间:2017-02-13 14:21:19

标签: json jackson

我已经让HttpsURLConnection接收有关我的服务器的一些信息。 回应的结果是:

{"about":{"title":"NiFi","version":"1.1.0","uri":"https://localhost:443/api/","contentViewerUrl":"/nifi-content-viewer/","timezone":"CET"}}

如何提取所有属性和键/值?

About.class文件

public class About {

private List<AboutObject> about;
public About()
{
//  this.about = about;
}
public List<AboutObject> getAbout() {
    return this.about;
}
public void setAbout(List<AboutObject> about) {
    this.about = about;
}
}

AboutObject.class

public class AboutObject {

private String title;
private String uri;
private String contentViewerUrl;
private String timezone;

public String getTitle()
{
    return this.title;
}

public void setTitle(String title)
{
    this.title = title;
}

public String getUri()
{
    return this.uri;
}

public void setUri(String uri)
{
    this.uri = uri;
}

public String getContentViewerUrl()
{
    return this.contentViewerUrl;
}

public void setContentViewerUrl(String contentViewerUrl)
{
    this.contentViewerUrl = contentViewerUrl;
}

public String getTimeZone()
{
    return this.timezone;
}

public void setTimeZone(String timezone)
{
    this.timezone = timezone;
}
}

Main.class

HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

// optional default is GET
con.setRequestMethod("GET");

//add request header
con.setRequestProperty("User-Agent", USER_AGENT);

int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(
        new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

//print result
System.out.println(response.toString());

System.out.println("Contenu de in = " + in.toString());

ObjectMapper mapper = new ObjectMapper();
//Staff objStaff = new Staff();

System.out.println("Object to JSON in file");
mapper.writeValue(new File("output/file.json"), response);
System.out.println("Convert JSON string from file to Object");
//String about = mapper.readValue(new File("output/file.json"), String.class);
About about = mapper.readValue(new File("output/file.json"), About.class);

错误

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of About: no String-argument constructor/factory method to deserialize from String value ('{"about":{"title":"NiFi","version":"1.1.0","uri":"https://localhost:443/api/","contentViewerUrl":"/nifi-content-viewer/","timezone":"CET"}}') at [Source: output/file.json; line: 1, column: 1]

谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

您显示的测试json没有About对象中使用的数组包装器。您还错过了AboutObject中的版本字段,而时区字段使用了错误的字词。

当我更新对象时,您的示例有效:

public class About {

    private AboutObject about;

    public AboutObject getAbout() {
        return about;
    }

    public void setAbout(AboutObject about) {
        this.about = about;
    }
}

public class AboutObject {

    private String title;
    private String uri;
    private String contentViewerUrl;
    private String timezone;
    private String version;

    public String getTitle() {
        return this.title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUri() {
        return this.uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public String getContentViewerUrl() {
        return this.contentViewerUrl;
    }

    public void setContentViewerUrl(String contentViewerUrl) {
        this.contentViewerUrl = contentViewerUrl;
    }

    public String getTimezone() {
        return timezone;
    }

    public void setTimezone(String timezone) {
        this.timezone = timezone;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

测试:

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    String obj = "{\"about\":{\"title\":\"NiFi\",\"version\":\"1.1.0\",\"uri\":\"https://localhost:443/api/\",\"contentViewerUrl\":\"/nifi-content-viewer/\",\"timezone\":\"CET\"}}";
    About about = mapper.readValue(obj, About.class);
}