【问题标题】:Gson to parse JSON file where root element is not constantGson解析根元素不恒定的JSON文件
【发布时间】:2017-11-21 14:49:34
【问题描述】:

我正在尝试解析一个看起来像这样的 json 文件 -

 {
  "gmps-camino": [
    {
      "id": "2903315183",
      "category": "NEW",
      "year": "2016",
      "make": "Chevrolet",
      "model": "4500 Gas",
      "trim": "2WD Reg Cab 150"",
      "type": "",
      "price": "56001.000000",
      "photo": "http://inventory-dmg.assets-cdk.com/chrome_jpgs/2016/24174x90.jpg"
    },
    {
      "id": "2774517143",
      "category": "NEW",
      "year": "2016",
      "make": "Chevrolet",
      "model": "Cruze",
      "trim": "Sedan L",
      "type": "CAR",
      "price": "17495.000000",
      "photo": "http://inventory-dmg.assets-cdk.com/RTT/Chevrolet/2016/3077853/default/ext_GAZ_deg01x90.jpg"
    }
  ]
 }

我正在尝试使用 Gson 来解析它并创建了一个类来模仿它 -

public class VehicleJson {
  String builder
  List<VehicleWithoutBuilder> vehiclesWithoutBuilder;
}

class vehicleWithoutBuilder {
  String id;
  String Category;
  String year;
  String make;
  String model;
  String trim;
  String type;
  Double price;
  String photo;
}

我希望将根元素的值“gmps-camino”插入到builder中,并将JSON的其余部分插入vehicleWithoutBuilder列表中。到目前为止,我解析这个文件的尝试都是徒劳的,因为 Gson 认为没有名为 gmps-camino 的类并且给我的字符串和列表都为 null。正确的做法是什么?

这是我试图解析的代码 -

BufferedReader br = new BufferedReader(new FileReader(jsonFileName));
Gson gson = new Gson();
VehicleJson vj = gson.fromJson(br, VehicleJson.class);

【问题讨论】:

  • 你能在解析 json 的地方显示你的代码吗?
  • 是否要将名为“gmps-camino”的Json数组作为字符串放入String“builder”中,并需要将解析后的值设置为vehicleWithoutBuilder列表?
  • @DerickDaniel 添加了我用来解析 json 的代码。
  • @Rohitchauhan 检查我的答案希望它有帮助
  • @J.R 是的,“gmps-camino”需要进入名为“builder”的变量中。然而问题是它并不总是“gmps-camino”,它可能是任何东西。它基本上是车辆制造商的名称。

标签: java json gson


【解决方案1】:

供您参考,如果需要,您可以在代码中使用JSONParser 和JSONArray。尝试以下代码并根据需要修改名称:

 JSONParser parser = new JSONParser();

   try {   

          Object objct = parser.parse(new FileReader("...")); //the location/name of your json file
          JSONObject jsonObject = (JSONObject) objct;
          JSONArray objs = (JSONArray) jsonObject.get("gmps-camino");
          for (Object obj : objs) {
               JSONObject jobj = (JSONObject) obj;
               String gmps = (String) jobj.get("gmps-camino");
               System.out.println(gmps);
          }
      }

您需要相应地更改名称。

有关参考,请参阅json-simple decoding example 页面上的“示例”。

或者,您可以检查以下 GSON 用法:

private static final Type VEHICLE = new TypeToken<List<vehicleWithoutBuilder>>() {
}.getType();

    Gson gson = new Gson();
    JsonReader reader = new JsonReader(new FileReader(filename));
    List<vehicleWithoutBuilder> data = gson.fromJson(reader, VEHICLE ); // contains the whole list
    data.toScreen(); // prints to screen some values

【讨论】:

    【解决方案2】:

    你的 Bean 应该有不同的结构,应该是这样的:

    public class VehicleJson {
      Map<String,List<VehicleWithoutWebID>> vehicles;
    }
    
    // Now lets parse the JSON and construct the BEAN
    VechicleJson vehicleJson = new Gson().fromJson("yourInput.json",VehicleJson.class);
    

    【讨论】:

    • 这合乎逻辑,但 gson 一直为我返回 null。
    • 我已经在我的开发环境中对其进行了测试,它工作正常。
    • 你使用了我在这里粘贴的相同的 Json 和类吗?
    【解决方案3】:

    如果你不想改变你的班级结构,试试这个

    将您的 VehicleJson 更改为

    public class VehicleJson {
      String builder;
      @SerializedName("myKey")
      List<VehicleWithoutBuilder> vehiclesWithoutBuilder;
    }
    

    并将动态根键值更改为“myKey”

    public JsonObject modifyJson(String inputJson) {
            JsonParser parser = new JsonParser();
            JsonObject jsonObject = parser.parse(inputJson).getAsJsonObject();
    
            //Get the random key
            String key = jsonObject.keySet().iterator().next();
    
            //Take a copy of the Array
            JsonElement copyArray = jsonObject.get(key);
    
            //Remove from JsonObject
            jsonObject.remove(key);
    
            String customKey = "myKey";
    
            jsonObject.add(customKey , copyArray);
    
            return jsonObject;
        }
    

    并用 GSON 解析

    Gson gson = new Gson();
    
            JsonObject jsonObject = modifyJson(json);
    
            VehicleJson result = gson.fromJson(jsonObject, VehicleJson.class);
    

    并手动将Json数组的String值映射到builder变量

    result.builder = jsonObject.getAsJsonArray("myKey").toString();
    

    【讨论】:

    • 你为什么要搞得这么复杂?
    • 它只是改变随机键的值。如果他不想更改 Class 结构,这很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多