有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用GSON从同一个JSON文件中获取多个Java对象?

我的json文件如下所示:

{
"card":[

    {
        "id": 1,
        "CardType":"xxx",
        "CardDescription":"xxx",
    },

    {
        "id": 2,
        "CardType":"yyy",
        "CardDescription":"yyy",
    }
]
}

对于这些“卡片”,我想生成一个Java对象。所以我用Java创建了一个“Card”类:

public class Card {
  private int id;
  private String cardType;
  private String cardDesc;

 //getters and setters
}

这里是我的第一个问题:我如何告诉我的程序“cardType”对应于JSON文件中的“cardType”

到目前为止,我生成对象的代码如下: (selectedFile是JSON文件,用户可以使用文件选择器选择)

try{
        Gson gson = new GsonBuilder().create();
        BufferedReader reader = new BufferedReader(new FileReader(selectedFile)); 
        JsonStreamParser p = new JsonStreamParser(reader);

        while(p.hasNext()){
            JsonElement e = p.next();
            if(e.isJsonObject()){
                Card card = gson.fromJson(e, Card.class);
                System.out.println(card.getCardDesc());
            }
        }

        //System.out.println();

    }
    catch(Exception f){
        f.printStackTrace();
    }

然而,这是行不通的。错误消息:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unexpected value at line 10 column 5 path $

我的代码错了吗?还是我的JSON文件有问题


共 (2) 个答案

  1. # 1 楼答案

    您应该直接解析到Card类,而不是通过解析器进行阅读

    创建包装器:

    public class CardArray {
        List<Card> card;
    }
    

    然后告诉你想用CardType路径映射cardType

    public class Card {
      private int id;
      @SerializedName("CardType") 
      private String cardType;
      @SerializedName("CardDescription") 
      private String cardDesc;
    
     //getters and setters
    }
    

    然后阅读你的数据:

     CardArray cardArray = gson.fromJson(reader, CardArray.class);
    
  2. # 2 楼答案

    像这样的东西可以做这项工作

    JsonObject jsonObject = gson.fromJson(reader, JsonObject.class);
    gson.fromJson(jsonObject.get("card"), new TypeToken<List<Card>>(){}.getType());