【问题标题】:Converting a JSON string into an object with a list of objects inside it - Java将 JSON 字符串转换为包含对象列表的对象 - Java
【发布时间】:2019-02-04 17:30:53
【问题描述】:

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

数据.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;
    }
}

建议.java

public class Suggestion {
    private String suggestion;
    private double points;

    public Suggestion(String suggestion, double points) {
        this.suggestion = suggestion;
        this.points = points;
    }

}

如何将 JSON “解压”成一个 Token 列表,每个 Token 都有两个必需的字符串和一个 Suggestion 对象列表作为其属性? (理想情况下,它将使用 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));

谢谢

【问题讨论】:

  • 嗯...阅读文档告诉你什么?
  • 你有什么尝试吗?
  • @RatishBansal 我已经添加了我尝试过的内容
  • 请添加getter setter并尝试一次

标签: java json gson deserialization


【解决方案1】:

你必须创建另一个类,比如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;
}

然后使用

Output output = new Gson().fromJson(json, Output.class);

然后您可以使用输出来获取tokens 的列表并进一步了解suggestion

【讨论】:

  • 这行得通,它消除了我遇到的错误,但是当我打印 output.getTokens() 时,我得到了 null
  • 我自己尝试了这段代码,我的输出包含令牌。请尝试这个获取token output.getTokens().get(0)。也可以分享一下输出后的代码。
  • JSONOutput 输出 = 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() ,它是 String 令牌属性的 getter,仍然为空。
【解决方案2】:

您可以使用杰克逊的TypeReference 来实现这一点,例如:

ObjectMapper objectMapper = new ObjectMapper();
TypeReference<List<Token>> typeReference = new TypeReference<List<Token>>() {};
List<Token> tokens = objectMapper.readValue("<json_stribg>", typeReference);

你可以阅读更多关于TypeReferencehere的信息。

【讨论】:

  • GsonJackson 是两个不同的库。
  • 我的错,我已经安装了 jackson 并添加了这段代码,但我得到了一个错误:com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT 令牌
【解决方案3】:

如果你使用 Jackson,你应该使用@JsonProperty 上面的字段。尝试如下编写文件:

公共类令牌{

@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

}

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2015-09-01
    相关资源
    最近更新 更多