杰克逊Java:未被标记为可忽略的字段无法识别

3
错误代码:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
Unrecognized field "id" (Class JacksonTester$Student), not
marked as ignorable
 at [Source: [B@40334c25; line: 2, column: 8] 
(through reference chain: Student["id"])

我有以下的JSON文件:

{
  "id": "0",
  "title": "0",
  "externalId": "0",
  "externalLink": "0",
  "sourceApplication": "0",
  "content": "0",
  "summaryContent": "0",
  "publishedDate": "0",
  "harvestDate": "0",
  "languageId": "0",
  "regionId": "0",
  "postStatus": "0"
}

and my code is

JacksonTester.java:

public class JacksonTester {
public static void main(String args[]) {

    ObjectMapper mapper = new ObjectMapper();

    // map json to student

    try {

        byte[] jsonData = Files.readAllBytes(Paths.get("output_json.txt"));
        Student student = mapper.readValue(jsonData, Student.class);
        System.out.println(student);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

static class Student {
    String id;
    String title;
    String externalId;
    String externalLink;
    String sourceApplication;
    String content;
    String summaryContent;
    String publishedDate;
    String harvestDate;
    String languageId;
    String regionId;
    String postStatus;

    public Student() {
    }

}
}
4个回答

1
你需要为这些字段设置setter方法或编写一个构造函数来接收这些字段作为参数(+适当的注解或Java 8和jackson-module-parameter-names模块中的-parameters)。
public static class Student {
    ...
    String postStatus;   

    public setPostStatus(postStatus) {
        this.postStatus = postStatus;
    }

    ...
}

0
Jackson无法访问Student的字段。
为Student实现公共的getter和setter方法,问题就解决了。

0
我解决了这个问题,现在它工作得很好。以下是我针对此问题的代码。
 **MainClass.java:**

 public class MainClass {

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

    String jsonStr = "{\r\n" + "    \"id\": \"168\",\r\n" + "   \"title\": \"Mr\",\r\n"
            + " \"externalId\": \"247518\",\r\n" + "    \"externalLink\": \"www.gmail.com\",\r\n"
            + " \"sourceApplication\": \"adsense\",\r\n" + "    \"content\": \"hmtl\",\r\n"
            + " \"summaryContent\": \"null\",\r\n" + "  \"publishedDate\": \"12122018\",\r\n"
            + " \"harvestDate\": \"12122018\",\r\n" + " \"languageId\": \"3\",\r\n" + " \"regionId\": \"45\",\r\n"
            + " \"postStatus\": \"1\"\r\n" + "}";

    ObjectMapper mapper = new ObjectMapper();

    MyPojo details = mapper.readValue(jsonStr, MyPojo.class);

    System.out.println("Value for getId  is: " + details.getId());
    System.out.println("Value for getSourceApplication  is: " + details.getSourceApplication());
    System.out.println("Value for getExternalId  is: " + details.getPublishedDate());
    System.out.println("Value for getExternalLink  is: " + details.getExternalLink());

} }

**MyPojo.class**

public class MyPojo {
private String content;

private String id;

private String sourceApplication;

private String title;

private String postStatus;

private String publishedDate;

private String summaryContent;

private String harvestDate;

private String languageId;

private String externalId;

private String regionId;

private String externalLink;

public String getContent() {
    return content;
}

public String getId() {
    return id;
}

public String getSourceApplication() {
    return sourceApplication;
}

public String getTitle() {
    return title;
}

public String getPostStatus() {
    return postStatus;
}

public String getPublishedDate() {
    return publishedDate;
}

public String getSummaryContent() {
    return summaryContent;
}

public String getHarvestDate() {
    return harvestDate;
}

public String getLanguageId() {
    return languageId;
}

public String getExternalId() {
    return externalId;
}

public String getRegionId() {
    return regionId;
}

public String getExternalLink() {
    return externalLink;
} }


**RESULT:**
 Value for getId  is: 168
 Value for getSourceApplication  is: adsense
 Value for getExternalId  is: 12122018
 Value for getExternalLink  is: www.gmail.com

注意 必须将JSON中的字段改为以小写字母开头。更改JSON的原因是Jackson bean序列化将反映在类上,并且当它看到getXyz()和setXyz()方法时,它将将这些映射到一个名为"xyz"(而不是"Xyz")的Json字段。我认为有几种方法可以覆盖此行为,其中一种是使用Jackson注解之一。


我同意字段名称应该使用小写字母。 - Kiran Suvarna

-2

不必创建那么多的公共getter方法,你可以直接将private变量修改为public


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接