gpt4 book ai didi

Java Json 程序不显示任何输出

转载 作者:行者123 更新时间:2023-11-29 05:45:26 30 4
gpt4 key购买 nike

我想做的是,当我导航到:

http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=[your_api_key]&q=Toy+Story+3&page_limit=1

它返回一个 JSON 响应。我想将它转换成 Java 对象。我正在使用 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 SetId(int i){ id = i; }

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

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

public int GetId()
{
return id;
}

public int GetYear()
{
return year;
}

public int GetTotal()
{
return total;
}
@Override
public String toString()
{
return "Movies[total=" +total + "id=" + id + "year=" + year + "]";
}
}

和我的映射器类:

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();
try
{
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);
}catch(MalformedURLException u)
{
u.printStackTrace();
}catch(URISyntaxException s)
{
s.printStackTrace();
}catch(IOException i)
{
i.printStackTrace();
}

}
}

它没有显示任何输出。我做错了什么吗?

最佳答案

您混合了基本的 Java 编程和 JSON 映射错误。首先记得关注lower camel case naming conventions在定义 Java 类时。这不仅是最佳实践,更重要的是,如果您不遵循此模式(包括 Jackson),一些工具和库将无法工作

就您的 JSON 映射错误而言,将 JSON 映射到 Java 对象时要记住的最重要的事情是 JSON 数据实际上是一个映射。它将键与值相关联,其中值可以是基元、对象或数组(集合)。因此,给定一个 JSON 结构,您必须查看每个键值的结构,然后决定该值是否应该在 Java 中表示为原始对象,或者作为两者之一的数组。这没有捷径,你会从经验中学习。这是一个例子:

{
"total": 1, // maps to primitive, integer
"movies": [ // '[' marks the beginning of an array/collection
{ // '{' marks the beginning of an object
"id": "770672122", // maps to primitive, string
"title": "Toy Story 3",
"year": 2010,
"mpaa_rating": "G",
"runtime": 103,
"release_dates": { // each array object also contains another object
"theater": "2010-06-18",
"dvd": "2010-11-02"
}
}
]
}

在映射上面的示例 JSON 时,您需要定义一个匹配最外层 { 的根对象。让我们将此根对象称为 MovieResponse

public class MovieResponse {
}

现在,向下遍历 JSON 数据,我们开始将所有 JSON 属性映射到 Java 属性:

@JsonIgnoreProperties(ignoreUnknown = true)
public class MovieResponse {
private Integer total; // map from '"total": 1'
private List<Movie> movies; // map from '"movies": [', remember, its a collection
}

简单吧?但是当然,我们还需要为Movie 类定义一个结构。再次遍历 JSON:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Movie {
private String id; // map from '"id": "770672122"'
private String title; // map from '"title": "Toy Story 3"'
private Integer year;
@JsonProperty("mpaa_rating")
private String mpaaRating;
private Integer runtime;
@JsonProperty("release_dates")
private Release released; // another object mapping!
}

最后,映射表示发布日期的最内层对象:

public class Release {
private String theater;
private String dvd;
}

就是这样,非常简单。请注意 Movie 类中 @JsonProperty 的使用。它允许您将 JSON 中的属性映射到 Java 中具有不同名称的属性。另请注意,为简洁起见,上述每个类中都省略了构造函数/ setter / getter 。在您的实际代码中,您将添加它们。最后,您将使用以下代码将示例 JSON 映射到 Java MovieResponse 类:

MovieResponse response = new ObjectMapper().readValue(json, MovieResponse.class);

关于Java Json 程序不显示任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16019117/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com