我使用GSON库解析服务器JSON响应.后端人员有时会告诉我:“由于某种原因,我们无法在JSON中指定变量类型”(旧的php,他们不知道如何执行操作,依此类推等等).
GSON喜欢在对象模型中进行强类型化.因此,我无法将Object解析为String.
GSON等待:
{
"service":{
"description":null,
"name":"Base",
"id":"4c7a90410529"
}
}
但是得到(空数据):
"service": ""
我得到
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396
解析此类响应的最佳实践是什么?
另一个问题:
如何构建对象,它可以识别不时返回的Integer变量为Integer还是String?同样的服务器端问题.
"data": "1"
要么
"data": 1
我知道-我们应该在Java中使用特定的类型.但是有时候值得做出让步,
谢谢
编辑:
我的解决方案基于Java Developer的答案.
ServiceDeserializer类根据其内部值反序列化每个对象.
public class ServiceDeserializer implements JsonDeserializer{
@Override
public ServiceState deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String name = "";
String uuid = "";
String description = "";
if (json.isJsonObject()) {
JsonObject obj = json.getAsJsonObject();
if (!obj.get("name").isJsonNull()) {
name = obj.get("name").getAsString();
}
if (!obj.get("uuid").isJsonNull()) {
uuid = obj.get("uuid").getAsString();
}
if (!obj.get("description").isJsonNull()) {
description = obj.get("description").getAsString();
}
}
return new ServiceState(name, uuid, description);
}
}
还有我的GSON构造函数,带有用于ServiceState的类型适配器.
Gson gson = new GsonBuilder()
.registerTypeAdapter(ServiceState.class, new ServiceDeserializer())
.create();
解决方法:
如果您要严格遵守gson,则可以提供一个自定义deserializer.由于我们知道服务是基本json字符串的一个属性或嵌入在其他属性中,因此我们可以使用反序列化器逐步解析出有问题的组件并相应地处理它们.
public class MyJsonDeserializer implements JsonDeserializer {
@Override
public YourParsedData deserialize(final JsonElement je, final Type type, final JsonDeserialization Context jdc) throws JsonParseException
{
final JsonObject obj = je.getAsJsonObject(); //our original full json string
final JsonElement serviceElement = obj.get("service");
//here we provide the functionality to handle the naughty element. It seems emtpy string is returned as a JsonPrimitive... so one option
if(serviceElement instanceOf JsonPrimitive)
{
//it was empty do something
}
return YourParsedData.create(); //provide the functionality to take in the parsed data
}
}
自定义解串器的调用方式如下:
final Gson gson = new GsonBuilder().registerTypeAdapter(YourParsedData.class, new MyJsonDeserializer()).create();
gson.fromJson("{service: ''}", YourParsedData.class);
我输入了所有这些内容,因此如果我错过一些语法,我深表歉意.
标签:android,java,json,gson,parsing
来源: https://codeday.me/bug/20191009/1881509.html