如何从Java中读取URL中的JSON数据?

时间:2013-04-14 18:58:15

标签: java json jackson

这是我的阿曼班:

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

2 个答案:

答案 0 :(得分:3)

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

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

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


编辑:

根据您的评论,您映射JSON的数据类也没有任何属性。这不会起作用。我建议你阅读FasterXML上的5 Minute Jackson Tutorial,但是映射的一般要点是:

给出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类,它具有与Rotten Tomatoes API发送给你的JSON相匹配的属性。

答案 1 :(得分:0)

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

您可以将其添加到课程中,也可以通过提供以下内容告诉Jackson忽略收到的未知事物:

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

在运行mapper.readValue()之前。