Java 将包含另一个JSON字符串的JSON对象解析为对象
目前,我正在一个学校项目中工作,我必须构建一个游戏,在这个游戏中,用户可以自定义一副卡片,并通过RESTAPI将其保存到数据库中。我成功地完成了这部分工作,但是我决定将卡片组作为JSON字符串保存到数据库表中。现在我在使用Gson将对象解析回正确的模型时遇到了问题,因为它需要一个正确类型的列表,而不是Json字符串 有没有人有一个很好的解决方案来轻松解析这个对象,或者在解析对象的其余部分之前从Json字符串中提取卡片组 我将提供一些示例代码来显示我的对象和Json的当前结构: 要转换为的模型Java 将包含另一个JSON字符串的JSON对象解析为对象,java,json,nested,gson,Java,Json,Nested,Gson,目前,我正在一个学校项目中工作,我必须构建一个游戏,在这个游戏中,用户可以自定义一副卡片,并通过RESTAPI将其保存到数据库中。我成功地完成了这部分工作,但是我决定将卡片组作为JSON字符串保存到数据库表中。现在我在使用Gson将对象解析回正确的模型时遇到了问题,因为它需要一个正确类型的列表,而不是Json字符串 有没有人有一个很好的解决方案来轻松解析这个对象,或者在解析对象的其余部分之前从Json字符串中提取卡片组 我将提供一些示例代码来显示我的对象和Json的当前结构: 要转换为的模型 p
public class CharacterModel{
private String characterName;
private int maxHp
private List<BattleCard> cardDeck
public CharacterModel(){}
//Getters and Setters for all paramters below
}
解决这个问题的最佳方法是什么?由于JSON字符串嵌套到父JSON字符串中的方式,Gson在尝试转换时无法将其识别为对象。对此问题的任何帮助都将不胜感激。一般来说,现在更可能使用和/或,因为它是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());
Card jsonbCard=新卡();
jsonbCard.name=“JSON-B”;
jsonbCard.value=9001;
Card gsonCard=新卡();
gsonCard.name=“GSON”;
gsonCard.value=-9001;
List cardList=new ArrayList();
cardList.add(jsonbCard);
cardList.add(gsonCard);
jsonbjsonb=JsonbBuilder.create();
String listSerialized=jsonb.toJson(cardList);
System.out.println(列表序列化);
List cardListFromJson=jsonb.fromJson(listSerialized,新ArrayList(){}.getClass().getGenericSuperclass());
Gson Gson=新的Gson();
List cardListFromJson_GSON=GSON.fromJson(listSerialized,new TypeToken(){}.getType());
这生成了以下JSON字符串:[{“name”:“JSON-B”,“value”:9001},{“name”:“GSON”,“value”:-9001}]
并将该字符串反序列化回卡的列表中
所以在你的情况下,你可以
创建另一个包含cardDeck
作为字符串的类,将JSON绑定到该类,创建实际的字符
类,并通过将该cardDeck字符串
绑定到列表
来设置列表
使用解析并从JSON中提取cardDeck
字符串,将其从JSON中删除,将其解析到对象,将提取的cardDeck
字符串解析到列表中,并将其设置到以前分配的对象上
正确序列化,您就不会有这种混乱;)李>
主要错误是JSON中的cardDeck
一开始就不应该是字符串
。最终采用了您提供的第二个解决方案并将其实施到项目中。现在的作品非常感谢!在未来,我将尝试看看是否可以避免重新创建类似的情况,因为事实证明,这更多地是我的项目中的设计缺陷,而不是序列化问题。
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());