gpt4 book ai didi

java - 将包含另一个 JSON 字符串的 JSON 对象解析为对象

转载 作者:行者123 更新时间:2023-12-02 09:07:27 25 4
gpt4 key购买 nike

目前我正在开展一个学校项目,我必须构建一个游戏,用户可以在其中自定义一副纸牌并通过 REST API 将其保存到数据库中。这部分我成功地工作了,但是我决定将一副纸牌作为 JSON 字符串保存到我的数据库表中。现在,我在使用 Gson 将对象解析回正确的模型时遇到问题,因为它需要正确类型的列表而不是 Json 字符串。

有没有人有一个好的解决方案来轻松解析该对象或在解析对象的其余部分之前从 Json 字符串中提取一副纸牌?

我将提供一些示例代码来显示我的对象和 Json 的当前结构:

要转换为的模型

public class CharacterModel{
private String characterName;
private int maxHp
private List<BattleCard> cardDeck

public CharacterModel(){}

//Getters and Setters for all paramters below
}

Json 格式

{
"characterName": "TestCharacter;",
"maxHp": "4",
"cardDeck": "{Json String with the List of Cards here}"
}

解决这个问题的最佳方法是什么?由于 JSON 字符串嵌套到父 JSON 字符串中的方式,Gson 在尝试转换时不会将其识别为对象。任何有关此问题的帮助将不胜感激。

最佳答案

一般来说,现在更可能使用JSON-B和/或 JSON-P因为它是 java 规范的一部分。然而,GSON 也支持绑定(bind)。当您使用 POJO/实体时,您通常不必在 2020 年手动生成或解析任何 JSON。绑定(bind)就是您要找的词;)

我已经使用 JSON-B 和 GSON 实现了一个示例,在这种情况下它们并没有太大区别。

    Card jsonbCard = new Card();
jsonbCard.name = "JSON-B";
jsonbCard.value = 9001;
Card gsonCard = new Card();
gsonCard.name = "GSON";
gsonCard.value = -9001;

List<Card> cardList = new ArrayList<>();
cardList.add(jsonbCard);
cardList.add(gsonCard);

Jsonb jsonb = JsonbBuilder.create();
String listSerialized = jsonb.toJson(cardList);
System.out.println(listSerialized);

List<Card> cardListFromJson = jsonb.fromJson(listSerialized, new ArrayList<Card>(){}.getClass().getGenericSuperclass());

Gson gson = new Gson();
List<Card> cardListFromJson_GSON = gson.fromJson(listSerialized, new TypeToken<List<Card>>(){}.getType());

这生成了以下 JSON 字符串:[{"name":"JSON-B","value":9001},{"name":"GSON","value":-9001}] 并将字符串反序列化回 CardList 中。

所以就你的情况而言,你可以

  1. 创建另一个包含 cardDeck 作为字符串的类,将 JSON 绑定(bind)到该类,创建实际的 Character 类并通过绑定(bind)该 cardDeck String列表
  2. 使用解析从JSON中提取cardDeck字符串,将其从JSON中删除,解析为对象,将提取的cardDeck字符串解析为List并设置它在之前的物体上。
  3. 正确序列化,就不会出现这种困惑;)

主要错误是 JSON 中的 cardDeck 不应该是 String 开头。

关于java - 将包含另一个 JSON 字符串的 JSON 对象解析为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699963/

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