使用Gson解析Json结果

时间:2013-10-09 20:52:37

标签: java json gson

我第一次使用GSON,当我调用httpGet请求时,它返回一个Json对象字符串 result ,如下所示:

{"ContentEncoding":null,"ContentType":null,"Data":[{"Id":3,"Name":"Alabama"},
{"Id":4,"Name":"Alaska"},{"Id":5,"Name":"Arizona"},{"Id":6,"Name":"Arkansas"}]}

我想要的只是Data对象,所以我的CustomModel类是这样的:

 public class CustomModel {

@SerializedName("Id")
private int Id;

@SerializedName("Name")
private string Name;

public int getId() {
   return this.Id;
}
 public void setId(int id) {
   this.Id = id;
}
 public string getName() {
   return this.Name;
}
 public void setName(string Name) {
   this.Name = Name;
}

}

使用GSON我尝试解析它:

 JsonArray Jarray = (JsonArray) parser.parse(results).getAsJsonObject().get("Data");
 for(JsonElement obj : Jarray )
 {

    CustomModel cse = gson.fromJson(obj  , CustomModel.class);
    // list.add(cse); //add the values to global List object
 }

但是这会在for循环中抛出一个错误“Expected Begin_Object但是是string”。我一直试图通过谷歌搜索来解决这个问题,但没有回答帮助

2 个答案:

答案 0 :(得分:2)

我认为您没有在java.lang.String中导入CustomModel,而是使用名为string的自定义类。这是Gson作为Object处理的内容。

Expected Begin_Object but was string

您应该导入java.lang.String


是的,您可以直接将列表反序列化为

,而不是循环
Type listType = new TypeToken<List<CustomModel>>(){}.getType();
List<CustomModel> listCSE = gson.fromJson(Jarray, listType);

System.out.println(listCSE.get(0).getName()); // Alabama

答案 1 :(得分:0)

我认为GSON文档可能包含您的答案。

请参阅https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types

以下是一个例子:

package com.stackexchange.stackoverflow;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.annotations.SerializedName;

public class Question19282481 {
  public static void main(String[] args) {
    String json = "{\"ContentEncoding\":null,\"ContentType\":null,\"Data\":[{\"Id\":3,\"Name\":\"Alabama\"},\n" +
      "{\"Id\":4,\"Name\":\"Alaska\"},{\"Id\":5,\"Name\":\"Arizona\"},{\"Id\":6,\"Name\":\"Arkansas\"}]}";

    Gson gson = new Gson();

    JsonParser jsonParser = new JsonParser();
    JsonElement jsonElement = jsonParser.parse(json);
    JsonObject jsonObject = jsonElement.getAsJsonObject();
    JsonArray jsonArray = jsonObject.getAsJsonArray("Data");
    for(JsonElement obj : jsonArray) {
      CustomModel customModel = gson.fromJson(obj, CustomModel.class);
      System.out.println(customModel);
    }
  }

  class CustomModel {
    @SerializedName("Id")
    private int id;

    @SerializedName("Name")
    private String name;

    int getId() {
      return id;
    }

    void setId(int id) {
      this.id = id;
    }

    String getName() {
      return name;
    }

    void setName(String name) {
      this.name = name;
    }

    @Override
    public String toString() {
      return "CustomModel{" +
        "id=" + id +
        ", name='" + name + '\'' +
        '}';
    }
  }
}

取决于:

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.2.4</version>
</dependency>

程序输出如下:

CustomModel{id=3, name='Alabama'}
CustomModel{id=4, name='Alaska'}
CustomModel{id=5, name='Arizona'}
CustomModel{id=6, name='Arkansas'}