2

这是我的阿曼班:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown=true)
public class  Aman
{

public static class Title
{
    private String title;

    public String getTitle(){ return title; }

    public String setTitle(String s){ return title = s; }
}

private int id;
private int year;
private int total;

public void id(int i){ id = i; }

public void year(int y){ year = y; }

public void total(int t){ total =t; }
}

这是映射值的 Movie 类:

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.*;

public class Movie
{
 public static void main(String[] args) throws MalformedURLException, URISyntaxException, IOException {
 Aman a = new Aman();
 ObjectMapper mapper = new ObjectMapper();
 URL RT = new URL("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=gzscv4f8zqse75w94mmp37zz&q=Toy+Story+3&page_limit=1").toURI().toURL();
 a = mapper.readValue(RT, Aman.class);
    }

}

我一遍又一遍地遇到同样的异常。

难道我做错了什么?

这是不断发生的异常:

Exception:Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "total" (Class Aman), not marked as ignorable at [Source: http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=gzscv4f8zqse75w94mmp37zz&q=Toy+Story+3&page_limit=1; line: 31, column: 11] (through reference chain: Aman["total"])

4

2 回答 2

3

Aman类的顶部,添加以下注释 - @JsonIgnoreProperties(unknown=true)。或者实际上将 JSON 中存在的所有属性映射为类中的属性。

@JsonIgnoreProperties(ignoreUnknown=true)
class Aman {
    // properties
}

Jackson FasterXML Wiki中描述了管理非映射属性的其他一些选项。


编辑:

根据您的评论,您映射 JSON 的数据类也没有任何属性。这是行不通的。我建议阅读有关 FasterXML 的5 分钟 Jackson 教程,但映射的一般要点是:

给定 JSON 文档:

{
    "message" : "Hi, I am a JSON object",
    "sender" : "Bob"
}

和 Java 对象:

@JsonIgnoreProperties(unknown=true)
class Post {
    private String message;
}

您可以使用 Jackson 编写以下代码以将 JSON 映射到对象:

final ObjectMapper mapper = new ObjectMapper();
final Post post = mapper.readValue(json, Post.class);

假设这json是一个包含显示的 JSON 数据的字符串

Jackson 会将 JSON 中的属性映射到 Java 对象中的属性。在所示示例中,JSON 中有一个名为sender. 通常,如果您的 Java 对象上没有同名的相应属性,则库会抛出异常,但使用@JsonIgnoreProperties(unknown=true)注释会覆盖此行为,反序列化会继续进行。

因此,您需要做的是定义一个Aman类,该类的属性与烂番茄 API 发送给您的 JSON 相匹配。

于 2013-04-14T19:04:35.940 回答
0

Aman应该从远程接收数据的类没有字段total,而您收到的 JSON 具有此字段。

您可以将其添加到课程中,也可以通过以下方式告诉杰克逊忽略它收到的未知事物:

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

在运行之前mapper.readValue()

于 2013-04-14T19:03:23.967 回答