Java 使用Gson解析Json结果

Java 使用Gson解析Json结果,java,json,gson,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"}]} 我只需要数据对象,因此我的CustomModel类如下所示: publi

我是第一次使用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"}]}
我只需要数据对象,因此我的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循环中抛出一个错误“预期的Begin\u对象但为string”。我一直在通过谷歌搜索试图找到答案,但没有任何答案可以帮助我

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

以下是一个例子:

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
中导入
java.lang.String
,而是使用名为
String
的自定义类。这就是
Gson
作为
对象处理的内容

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
Type listType=new-TypeToken(){}.getType();
List listCSE=gson.fromJson(Jarray,listType);
System.out.println(listCSE.get(0.getName());//阿拉巴马州

这对我很有用。您确定显示的是正确的JSON吗?另外,请记住Java命名约定规定变量名应以小写字符开头。我是肯定的。它编译了,但抛出了一个错误,正如我在下面的第二行@SotiriosDelimanolis中所说的。不可复制,杰克。
string
应该是
string
还是你有自己的
string
课程?你说得对。它使用了“Android.R”名称空间中的字符串。几年来我第一次使用Java时,我认为android是一个字符串object@Jake切勿导入
R
,请使用完全限定的名称。它可以防止这些错误。@Jake,我真的以为编译程序时是打字错误。:)是将for循环简化为一行语句的一种方法。看起来for-loop做的是双重功。全局列表对象是ArrayList
Type listType = new TypeToken<List<CustomModel>>(){}.getType();
List<CustomModel> listCSE = gson.fromJson(Jarray, listType);

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