将JSON字符串转换为包含对象列表的对象-Java
我需要在Java中以以下格式反序列化JSON的帮助: data.json将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 }, {
{
"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.NullPointerExceptionoutput.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