将包含另一个 JSON 字符串的 JSON 对象解析为对象
Parsing JSON object that contains another JSON String to a Object
目前我正在做一个学校项目,我必须构建一个游戏,用户可以在其中自定义一副纸牌并通过 REST API 将其保存到数据库中。这部分我成功地工作了,但是我决定将卡片组作为 JSON 字符串保存到我的数据库 table 中。现在我在使用 Gson 将对象解析回正确的模型时遇到问题,因为它需要正确键入的列表而不是 Json String.
有没有人有一个很好的解决方案来轻松解析此对象或在解析对象的其余部分之前从 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 and/or JSON-P,因为它是 java 规范的一部分。然而,GSON 也支持绑定。当您使用 POJO/实体时,您通常不必在 2020 年手动生成或解析任何 JSON。绑定是您正在寻找的词 ;)
我已经用 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}]
并将该字符串反序列化为 Card
的 List
。
所以在你的情况下,你可以
- 创建另一个包含
cardDeck
作为字符串的 class,将 JSON 绑定到它,创建实际的 Character
class 并设置列表将该 cardDeck String
绑定到 List
.
- 使用解析从JSON中提取
cardDeck
字符串,从JSON中移除,解析为对象,将提取的cardDeck
字符串解析为a List 并将其设置在先前设置的对象上。
- 正确序列化,您不会遇到这种混乱;)
主要错误是 JSON 中的 cardDeck
不应该是 String
开头。
目前我正在做一个学校项目,我必须构建一个游戏,用户可以在其中自定义一副纸牌并通过 REST API 将其保存到数据库中。这部分我成功地工作了,但是我决定将卡片组作为 JSON 字符串保存到我的数据库 table 中。现在我在使用 Gson 将对象解析回正确的模型时遇到问题,因为它需要正确键入的列表而不是 Json String.
有没有人有一个很好的解决方案来轻松解析此对象或在解析对象的其余部分之前从 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 and/or JSON-P,因为它是 java 规范的一部分。然而,GSON 也支持绑定。当您使用 POJO/实体时,您通常不必在 2020 年手动生成或解析任何 JSON。绑定是您正在寻找的词 ;)
我已经用 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}]
并将该字符串反序列化为 Card
的 List
。
所以在你的情况下,你可以
- 创建另一个包含
cardDeck
作为字符串的 class,将 JSON 绑定到它,创建实际的Character
class 并设置列表将该 cardDeckString
绑定到List
. - 使用解析从JSON中提取
cardDeck
字符串,从JSON中移除,解析为对象,将提取的cardDeck
字符串解析为a List 并将其设置在先前设置的对象上。 - 正确序列化,您不会遇到这种混乱;)
主要错误是 JSON 中的 cardDeck
不应该是 String
开头。