简体   繁体   中英

How to convert List to a JSON Object using GSON?

I have a List which I need to convert into JSON Object using GSON. My JSON Object has JSON Array in it.

public class DataResponse {

    private List<ClientResponse> apps;

    // getters and setters

    public static class ClientResponse {
        private double mean;
        private double deviation;
        private int code;
        private String pack;
        private int version;

        // getters and setters
    }
}

Below is my code in which I need to convert my List to JSON Object which has JSON Array in it -

public void marshal(Object response) {

    List<DataResponse.ClientResponse> clientResponse = ((DataResponse) response).getClientResponse();

    // now how do I convert clientResponse list to JSON Object which has JSON Array in it using GSON?

    // String jsonObject = ??
}

As of now, I only have two items in List - So I need my JSON Object like this -

{  
   "apps":[  
      {  
         "mean":1.2,
         "deviation":1.3
         "code":100,
         "pack":"hello",
         "version":1
      },
      {  
         "mean":1.5,
         "deviation":1.1
         "code":200,
         "pack":"world",
         "version":2
      }
   ]
}

What is the best way to do this?

There is a sample from google gson documentation on how to actually convert the list to json string:

Type listType = new TypeToken<List<String>>() {}.getType();
 List<String> target = new LinkedList<String>();
 target.add("blah");

 Gson gson = new Gson();
 String json = gson.toJson(target, listType);
 List<String> target2 = gson.fromJson(json, listType);

You need to set the type of list in toJson method and pass the list object to convert it to json string or vice versa.

If response in your marshal method is a DataResponse , then that's what you should be serializing.

Gson gson = new Gson();
gson.toJson(response);

That will give you the JSON output you are looking for.

Assuming you also want to get json in format

{
  "apps": [
    {
      "mean": 1.2,
      "deviation": 1.3,
      "code": 100,
      "pack": "hello",
      "version": 1
    },
    {
      "mean": 1.5,
      "deviation": 1.1,
      "code": 200,
      "pack": "world",
      "version": 2
    }
  ]
}

instead of

{"apps":[{"mean":1.2,"deviation":1.3,"code":100,"pack":"hello","version":1},{"mean":1.5,"deviation":1.1,"code":200,"pack":"world","version":2}]}

you can use pretty printing . To do so use

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(dataResponse);

确保将您的集合转换为数组:

Gson().toJson(objectsList.toTypedArray(), Array<CustomObject>::class.java)

We can also use another workaround by first creating an array of myObject then convert them into list.

final Optional<List<MyObject>> sortInput = Optional.ofNullable(jsonArgument)
                .map(jsonArgument -> GSON.toJson(jsonArgument, ArrayList.class))
                .map(gson -> GSON.fromJson(gson, MyObject[].class))
                .map(myObjectArray -> Arrays.asList(myObjectArray));

Benifits:

  • we are not using reflection here. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM