3

我一直在尝试使用我的 PC 上的 JSON 文件将 JSON 数据映射到 Java 对象,但它总是抛出异常:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "title" (Class MovieResponse), not marked as ignorable at [Source: C:\M.json; line: 2, column: 13] (through reference chain: MovieResponse["title"])

我的数据类:

import org.codehaus.jackson.annotate.JsonProperty;

public class MovieResponse{
  private String title;
  private Integer year;
  @JsonProperty("mpaa_rating")
  private String mpaaRating;
  private Integer runtime;
  @JsonProperty("critics_consensus")
  private String criticsConsensus;

  public String getTitle(){
    return title;
  }
  public String setTitle(String t){
    return title = t;
  }

  public Integer getYear(){
    return year;
  }
  public Integer setYear(Integer y){
    return year = y;
  }

  public String getMpaa(){
    return mpaaRating;
  }
  public String setMpaa(String mp){
    return mpaaRating = mp;
  }

  public Integer getRuntime(){
    return runtime;
  }
  public Integer setRuntime(Integer r){
    return runtime = r;
  }

  public String getCritics(){
    return criticsConsensus;
  }
  public String setCritics(String c){
    return criticsConsensus = c;
  }

  @Override
  public String toString(){
    return "MovieResponse[title="+title+",year="+year+",mpaa_Rating="+mpaaRating+",runtime="+runtime+",critics_Consensus="+criticsConsensus
            +"]";
  }
}

我的映射器类:

import java.io.File;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import java.net.*;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties
public class Movie{
 public static void main(String[] args) throws MalformedURLException, URISyntaxException, IOException {
 MovieResponse a = new MovieResponse();
 ObjectMapper mapper = new ObjectMapper();
 try{

     MovieResponse response = new ObjectMapper().readValue(new File("C:\\M.json"), MovieResponse.class);
 }catch(MalformedURLException u){
    u.printStackTrace();
 }
 catch(IOException i){
    i.printStackTrace();
 }
 }

json 文件包含以下数据:

{
  "title": "Toy Story 3",
  "year": 2010,
  "mpaa_rating": "G",
  "runtime": 103,
  "critics_consensus": "Deftly blending comedy, adventure, and honest emotion, Toy Story 3 is a rare second sequel that really works."
}

我究竟做错了什么?我正在使用杰克逊图书馆。

4

2 回答 2

4

这是我在您的代码中看到的问题列表:

  1. @JsonIgnoreProperties属性应该放在类之上,而MovieResponse不是Movie类之上。查看文档,最值得注意的是关于“ignoreUnknown”属性的内容,默认为 false:

    公共抽象布尔忽略未知

    定义在反序列化期间是否可以忽略任何无法识别的属性的属性。如果为 true,则所有无法识别的属性——即没有接受它们的设置者或创建者——将被忽略而不会发出警告(尽管仍将调用未知属性的处理程序,如果有的话),无一例外。

  2. 您的二传手不应返回任何值,这可以解释为什么杰克逊没有看到“头衔”二传手。以下是“title”的设置器应该是这样的:

    public void setTitle(String t) {
        title = t;
    }
    
  3. 不是它不起作用的原因,但是您要声明您的对象映射器两次,请考虑使用您的映射器而不是实例化一个新的映射器:

    MovieResponse response = mapper.readValue(new File("C:\\M.json"), MovieResponse.class);
    

编辑:这是我认为的固定代码:

import java.io.File;
import org.codehaus.jackson.map.ObjectMapper;
import java.net.*;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

public class Movie {
    public static void main(String[] args) throws Exception {
        MovieResponse response;
        ObjectMapper mapper = new ObjectMapper();

        response = mapper.readValue(new File("C:\\M.json"), MovieResponse.class);
        System.out.println(response);
    }
}
于 2013-04-18T18:42:09.657 回答
1

这也可以

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
MovieResponse response = mapper.readValue(new File("C:\\M.json"), MovieResponse.class);
于 2014-01-07T19:09:53.543 回答