如何反序列化使用GSON作为单个对象或对象列表传递的字段?

时间:2018-09-22 12:51:01

标签: java gson

我已经成功地使用GSON将JSON转换为单个Object并将JSON转换为对象列表。我的问题是有2个来源向我发送数据。一个只发送一个对象,另一个发送一个对象列表。

第一个来源的

单个对象

Process Process-1:
Traceback (most recent call last):
  File "C:\Users\xyz\AppData\Local\Programs\Python\Python34-32\lib\multiprocessing\process.py", line 297, in _bootstrap
    self.run()
  File "C:\Users\xyz\AppData\Local\Programs\Python\Python34-32\lib\multiprocessing\process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\xyz\PycharmProjects\Test\main\Main.py", line 16, in launcher
    dill.dump(process, ser, protocol=dill.HIGHEST_PROTOCOL, byref=True, recurse=True)
OSError: [Errno 22] Invalid argument

Traceback (most recent call last):
  File "C:/Users/xyz/PycharmProjects/Test/main/Main.py", line 40, in <module>
    launch(program, '127.0.0.1', '-n', '10')
  File "C:/Users/xyz/PycharmProjects/Test/main/Main.py", line 28, in launch
    application_process = dill.load(ser)
  File "C:\Users\xyz\PycharmProjects\Test\venv\lib\site-packages\dill\_dill.py", line 304, in load
    obj = pik.load()
EOFError: Ran out of input
来自第二个来源的

对象列表

{
    id : '1',
    title: 'sample title',
    ....
}

该类用于反序列化:

[
    {
        id : '1',
        title: 'sample title',
        ....
    },
    {
        id : '2',
        title: 'sample title',
        ....
    },
    ...
]

以下是我的第一种情况:

 public class Post {

      private String id;
      private String title;

      /* getters & setters */
 }

这适用于我的第二种情况:

Post postData = gson.fromJson(jsonObj.toString(), Post.class);

有没有办法处理这两种情况?还是应该查看字符串并在不可用时添加[] 谢谢

2 个答案:

答案 0 :(得分:1)

如何创建一个自定义反序列化器来检查json是否为数组,如果不是则创建其中包含单个对象的数组,如:

public class PostArrayOrSingleDeserializer implements JsonDeserializer<Post[]> {

    private static final Gson gson = new Gson();

    public Post[] deserialize(JsonElement json, Type typeOfT, 
                JsonDeserializationContext ctx) {
        try {
            return gson.fromJson(json.getAsJsonArray(), typeOfT);
        } catch (Exception e) {
            return new Post[] { gson.fromJson(json, Post.class) };
        }
    }
}

并将其添加到您的Gson:

Post[] postDatas = new GsonBuilder().setPrettyPrinting()
    .registerTypeAdapter(Post[].class, new PostArrayOrSingleDeserializer())
    .create()
    .fromJson(jsonObj.toString(), Post[].class);

因此,您应该始终包含一个包含一个或多个项目的Post数组。

答案 1 :(得分:0)

您可以使两个源以相似的结构向您发送数据。例如,他们两个都发送对象列表。如果要发送一个对象,则需要更新该对象以向您发送一个对象的列表,这样您就可以管理两种情况。