32

我正在尝试将自定义类的 ArrayList 转换为 JsonArray。下面是我的代码。它执行得很好,但是一些 JsonArray 元素作为 0 出现,即使它们是 ArrayList 中的数字。我试图将它们打印出来。就像 ArrayList 中的 customerOne 年龄是 35 但在 JsonArray 中是 0。有什么问题?

    ArrayList<Customer> customerList = CustomerDB.selectAll();
    Gson gson = new Gson();

    JsonElement element = 
     gson.toJsonTree(customerList , new TypeToken<List<Customer>>() {}.getType());

    JsonArray jsonArray = element.getAsJsonArray();
4

7 回答 7

42

下面的代码应该适用于您的情况。

List<Customer> customerList = CustomerDB.selectAll();

Gson gson = new Gson();
JsonElement element = gson.toJsonTree(customerList, new TypeToken<List<Customer>>() {}.getType());

if (! element.isJsonArray() ) {
// fail appropriately
    throw new SomeException();
}

JsonArray jsonArray = element.getAsJsonArray();

哎呀,List在转换 JSON 树之前使用接口来收集值。

于 2013-09-17T19:12:33.330 回答
14

作为附加答案,它也可以缩短。

List<Customer> customerList = CustomerDB.selectAll();

JsonArray result = (JsonArray) new Gson().toJsonTree(customerList,
            new TypeToken<List<Customer>>() {
            }.getType());
于 2015-09-22T10:57:14.077 回答
5

与其他答案相比,不知道该解决方案的性能如何,但这是另一种方法,它非常干净,对于大多数情况应该足够了。

ArrayList<Customer> customerList = CustomerDB.selectAll();
Gson gson = new Gson();
String data = gson.toJson(customerList);
JsonArray jsonArray = new JsonParser().parse(data).getAsJsonArray();

很想听听其他人的意见,但如果这实际上是低效的,那么它是如何低效的。

于 2016-12-29T13:16:51.283 回答
3

考虑一个类型的对象列表Model.class

ArrayList<Model> listOfObjects = new ArrayList<Model>();

列表到 JSON

String jsonText =  new Gson().toJson(listOfObjects);

JSON 到 LIST

 Type listType = new TypeToken<List<Model>>() {}.getType();

 List<Model> myModelList = new Gson().fromJson(jsonText , listType);
于 2017-12-25T13:49:45.007 回答
3

对于在Kotlin中进行操作的任何人,您都可以通过这种方式获得它,

val gsonHandler = Gson()
val element: JsonElement = gsonHandler.toJsonTree(yourListOfObjects, object : TypeToken<List<YourModelClass>>() {}.type)
于 2018-02-03T04:52:57.097 回答
2

List<> 是一个普通的 java 对象,可以使用标准的 gson 对象 api 成功转换。gson 中的列表如下所示:

"libraries": [
    {
      //Containing object 
    },
    {
      //Containing object 
    }
   ],
...
于 2013-09-17T19:14:20.970 回答
-2

使用 google gson jar,请参见下面的示例代码,

    public class Metric {
        private int id;
        ...
       setter for id
        ....
       getter for id
    }

    Metric metric = new Metric();
    metric.setId(1);

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.serializeNulls();
    Gson gson = gsonBuilder.create();
    System.out.println(gson.toJson(metric));

StringBuffer jsonBuffer = new StringBuffer("{ \"rows\": [");
List<Metric> metrices = new ArrayList<Metric>();
// assume you have more elements in above arraylist
boolean first = true;
for (Metric metric : metrices) {
       if (first)
      first = false;
    else
      jsonBuffer.append(",");
      jsonBuffer.append(getJsonFromMetric(metric));
}
jsonBuffer.append("]}");

private String getJsonFromMetric(Metric metric) {
GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.serializeNulls();
    Gson gson = gsonBuilder.create();
    return gson.toJson(metric);
}
于 2013-09-17T19:21:04.807 回答