我已经成功地使用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);
有没有办法处理这两种情况?还是应该查看字符串并在不可用时添加[] 谢谢
答案 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)
您可以使两个源以相似的结构向您发送数据。例如,他们两个都发送对象列表。如果要发送一个对象,则需要更新该对象以向您发送一个对象的列表,这样您就可以管理两种情况。