Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将包含另一个JSON字符串的JSON对象解析为对象_Java_Json_Nested_Gson - Fatal编程技术网

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

Java 将包含另一个JSON字符串的JSON对象解析为对象,java,json,nested,gson,Java,Json,Nested,Gson,目前,我正在一个学校项目中工作,我必须构建一个游戏,在这个游戏中,用户可以自定义一副卡片,并通过RESTAPI将其保存到数据库中。我成功地完成了这部分工作,但是我决定将卡片组作为JSON字符串保存到数据库表中。现在我在使用Gson将对象解析回正确的模型时遇到了问题,因为它需要一个正确类型的列表,而不是Json字符串 有没有人有一个很好的解决方案来轻松解析这个对象,或者在解析对象的其余部分之前从Json字符串中提取卡片组 我将提供一些示例代码来显示我的对象和Json的当前结构: 要转换为的模型 p

目前,我正在一个学校项目中工作,我必须构建一个游戏,在这个游戏中,用户可以自定义一副卡片,并通过RESTAPI将其保存到数据库中。我成功地完成了这部分工作,但是我决定将卡片组作为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字符串嵌套到父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());