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

如何在Java中将自定义类的ArrayList转换为JsonArray?,java,arraylist,gson,arrays,Java,Arraylist,Gson,Arrays,我正在尝试将自定义类的ArrayList转换为JsonArray。下面是我的代码。它执行得很好,但是一些JsonArray元素以零的形式出现,即使它们是ArrayList中的数字。我试着把它们打印出来。与customerOne一样,ArrayList中的年龄是35岁,而JsonArray中的年龄是0岁。有什么不对劲吗 ArrayList<Customer> customerList = CustomerDB.selectAll(); Gson gson = new G

我正在尝试将自定义类的ArrayList转换为JsonArray。下面是我的代码。它执行得很好,但是一些JsonArray元素以零的形式出现,即使它们是ArrayList中的数字。我试着把它们打印出来。与customerOne一样,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();
ArrayList customerList=CustomerDB.selectAll();
Gson Gson=新的Gson();
JsonElement元素=
toJsonTree(customerList,newtypetoken(){}.getType());
JsonArray JsonArray=element.getAsJsonArray();

以下代码适用于您的案例

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 customerList=CustomerDB.selectAll();
Gson Gson=新的Gson();
JsonElement元素=gson.toJsonTree(customerList,newtypetoken(){}.getType());
如果(!element.isJsonArray()){
//适当地失败
抛出新的SomeException();
}
JsonArray JsonArray=element.getAsJsonArray();
见鬼,在转换JSON树之前,使用
List
接口收集值。

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

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

使用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);
}
公共类度量{
私有int-id;
...
id设置器
....
id的getter
}
公制=新公制();
公制setId(1);
GsonBuilder GsonBuilder=新的GsonBuilder();
gsonBuilder.serializeNulls();
Gson-Gson=gsonBuilder.create();
System.out.println(gson.toJson(metric));
StringBuffer jsonBuffer=新的StringBuffer(“{\”行\“:[”);
List metrices=new ArrayList();
//假设在上面的arraylist中有更多的元素
布尔值优先=真;
用于(公制:公制){
如果(第一)
第一个=假;
其他的
jsonBuffer.append(“,”);
append(getJsonFromMetric(metric));
}
附加(“]}”);
私有字符串getJsonFromMetric(公制){
GsonBuilder GsonBuilder=新的GsonBuilder();
gsonBuilder.serializeNulls();
Gson-Gson=gsonBuilder.create();
返回gson.toJson(公制);
}

作为补充答案,它也可以缩短

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

JsonArray result = (JsonArray) new Gson().toJsonTree(customerList,
            new TypeToken<List<Customer>>() {
            }.getType());
List customerList=CustomerDB.selectAll();
JsonArray结果=(JsonArray)new Gson().toJsonTree(customerList,
新的TypeToken(){
}.getType());

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

ArrayList<Customer> customerList = CustomerDB.selectAll();
Gson gson = new Gson();
String data = gson.toJson(customerList);
JsonArray jsonArray = new JsonParser().parse(data).getAsJsonArray();
ArrayList customerList=CustomerDB.selectAll();
Gson Gson=新的Gson();
String data=gson.toJson(customerList);
JsonArray JsonArray=new-JsonParser().parse(data.getAsJsonArray();
如果这真的是低效的,那么我很想听听其他人的意见。

考虑
Model.class类型的对象列表
要列出的JSON

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

 List<Model> myModelList = new Gson().fromJson(jsonText , listType);
Type listType=new-TypeToken(){}.getType();
List myModelList=new Gson().fromJson(jsonText,listType);

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

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

第一步是将列表序列化为字符串,然后反序列化字符串。所以它真的很低效。
 Type listType = new TypeToken<List<Model>>() {}.getType();

 List<Model> myModelList = new Gson().fromJson(jsonText , listType);
val gsonHandler = Gson()
val element: JsonElement = gsonHandler.toJsonTree(yourListOfObjects, object : TypeToken<List<YourModelClass>>() {}.type)