将JSON字符串转换为包含对象列表的对象-Java

将JSON字符串转换为包含对象列表的对象-Java,java,json,gson,deserialization,Java,Json,Gson,Deserialization,我需要在Java中以以下格式反序列化JSON的帮助: data.json { "tokens":[ { "position":1, "text":"hello", "suggestions":[ { "suggestion":"hi", "points":0.534 }, {

我需要在Java中以以下格式反序列化JSON的帮助:

data.json

{
   "tokens":[
      {
         "position":1,
         "text":"hello",
         "suggestions":[
            {
               "suggestion":"hi",
               "points":0.534
            },
            {
               "suggestion":"howdy",
               "points":0.734
            }
         ]
      },
   ]
}
我创建了两个类,一个称为Token,另一个称为Suggestion,属性与JSON格式匹配

Token.java

public class Token {
    private int position;
    private String text;
    private List<Suggestion> suggestions;

    public Token(int position, String text, List<Suggestion> suggestions) {
        this.position = position;
        this.text = text;
        this.suggestions = suggestions;
    }
}
如何将JSON“解包”到一个令牌列表中,每个令牌都有两个必需的字符串和一个建议对象列表作为其属性? (理想情况下,它将使用Gson库)

我试过这个,但不起作用:

Gson gson = new Gson();
Type listType = new TypeToken<List<Token>>(){}.getType();

List<Token> tokenList = gson.fromJson(jsonString, listType);

System.out.println(tokenList.get(0));
Gson-Gson=new-Gson();
类型listType=newTypeToken(){}.getType();
List-tokenList=gson.fromJson(jsonString,listType);
System.out.println(tokenList.get(0));

谢谢

您可以使用Jackson的
类型参考
来实现这一点,例如:

ObjectMapper objectMapper = new ObjectMapper();
TypeReference<List<Token>> typeReference = new TypeReference<List<Token>>() {};
List<Token> tokens = objectMapper.readValue("<json_stribg>", typeReference);
ObjectMapper ObjectMapper=new ObjectMapper();
TypeReference TypeReference=新的TypeReference(){};
列表标记=objectMapper.readValue(“,typeReference);

你可以阅读更多关于
TypeReference

你必须创建另一个类,比如
Output
as

import java.util.List;

public class Output {
    public List<Token> getTokens() {
        return tokens;
    }

    public void setTokens(List<Token> tokens) {
        this.tokens = tokens;
    }

    private List<Token> tokens;
}

然后,您可以使用输出来获取
令牌列表
,并进一步查找
建议

如果您使用Jackson,则应在上述字段中使用@JsonProperty。尝试按以下方式编写文件:

公共类令牌{

@JsonProperty
private int position;

@JsonProperty
private String text;

@JsonProperty
private List<Suggestion> suggestions;

//getters/setters

}

嗯。。。阅读文档告诉了你什么?你尝试了什么吗?阅读主题@RatishBansal我已经添加了我尝试的内容请添加getter setter并尝试一次
Gson
Jackson
是两个不同的库。我的错,我已经安装了jackson并添加了此代码,但是我遇到了一个错误:com.fasterxml.jackson.databind.JsonMappingException:无法反序列化java.util.ArrayList的实例,因为它没有启动\u对象标记。这起作用,并且它消除了我遇到的错误,但是当我打印output.getTokens()时,我得到空值我自己尝试了这段代码,我的输出包含令牌。请尝试此操作以获取令牌输出。getTokens().get(0)。还可以在output.JSONOutput output=new Gson().fromJson(jsonString,JSONOutput.class)之后共享代码;System.out.println(output.getTokens().get(0));这就是我的代码,我得到java.lang.NullPointerException
output.getTokens().get(0)
将为您提供令牌对象。由于您尚未重写toString,它将不起作用。您可以打印标记成员,如output.getTokens().get(0)。getText()仍然不起作用,我甚至尝试了output.getTokens.get(0)。getToken(),它是字符串标记属性的getter,但仍然为null。
Output output = new Gson().fromJson(json, Output.class);
@JsonProperty
private int position;

@JsonProperty
private String text;

@JsonProperty
private List<Suggestion> suggestions;

//getters/setters
@JsonProperty
private String suggestion;

@JsonProperty
private double points;

// getters/setters