java未指定主类,java-GSON解析未指定的类型变量

我使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值