Mapping JSON data to Java objects

2020-03-26 05:04发布

I have been trying to map JSON data to Java objects, with the JSON file on my PC, but it always throws the exception:

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"])

My data class:

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
            +"]";
  }
}

My mapper class:

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();
 }
 }

The json file contains following data:

{
  "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."
}

What am I doing wrong? I am using the Jackson library.

标签: java json
2条回答
看我几分像从前
2楼-- · 2020-03-26 05:34

Here is a list of problems I see in your code:

  1. The @JsonIgnoreProperties attribute should be put above the MovieResponse class, not the Movie class. Check out the documentation, most notably what is said about the "ignoreUnknown" property, defaulted to false:

    public abstract boolean ignoreUnknown

    Property that defines whether it is ok to just ignore any unrecognized properties during deserialization. If true, all properties that are unrecognized -- that is, there are no setters or creators that accept them -- are ignored without warnings (although handlers for unknown properties, if any, will still be called) without exception.

  2. Your setters should not return any value, this may explain why Jackson does not see a "title" setter. Here is how the setter for "title" should be:

    public void setTitle(String t) {
        title = t;
    }
    
  3. Not a reason for it to NOT work, but you are declaring your object mapper twice, consider using your mapper instead of instanciating a new one:

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

Edit: here's your fixed code I think:

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);
    }
}
查看更多
够拽才男人
3楼-- · 2020-03-26 05:46

This will work too

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
MovieResponse response = mapper.readValue(new File("C:\\M.json"), MovieResponse.class);
查看更多
登录 后发表回答