如何在Java中将自定义类的ArrayList转换为JsonArray?

32

我正在尝试将自定义类的ArrayList转换为JsonArray。以下是我的代码。它可以正常执行,但有些JsonArray元素显示为零,即使它们在ArrayList中是数字。我已经尝试将它们打印出来。例如,ArrayList中的客户年龄是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();
7个回答

43

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

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树之前收集值。


14

作为额外的答案,它也可以变得更短。

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

JsonArray result = (JsonArray) new Gson().toJsonTree(customerList,
            new TypeToken<List<Customer>>() {
            }.getType());

5

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

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

但如果有其他人想要分享一下这个方法的不足之处,特别是效率方面的问题,我会非常乐意听取他们的意见。


1
首先,您将列表序列化为字符串,然后再对其进行反序列化。因此这实际上是非常低效的。 - momvart

3
考虑一个类型为Model.class的对象列表。
ArrayList<Model> listOfObjects = new ArrayList<Model>();

将列表转换为JSON格式

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

JSON转换为列表

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

 List<Model> myModelList = new Gson().fromJson(jsonText , listType);

3

如果您在使用 Kotlin 进行操作,可以按照以下方式获取它:

val gsonHandler = Gson()
val element: JsonElement = gsonHandler.toJsonTree(yourListOfObjects, object : TypeToken<List<YourModelClass>>() {}.type)

1

List<>是一个普通的Java对象,可以使用标准的gson对象API成功地进行转换。 在gson中,List的形式如下:

"libraries": [
    {
      //Containing object 
    },
    {
      //Containing object 
    }
   ],
...

-3
请使用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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接