发布于2023-12-25 22:23 阅读(720) 评论(0) 点赞(19) 收藏(1)
我使用 GSON 库解析服务器 JSON 响应。后端人员有时会告诉我:“出于某种原因,我们无法在 JSON 中指定变量类型”(旧的 php,他们不知道如何做到这一点等等)。GSON 喜欢在其对象模型中使用强类型。所以我无法将对象解析为字符串。
GSON 等待:
{
"service":{
"description":null,
"name":"Base",
"id":"4c7a90410529"
}
}
但它得到(空数据):
"service": ""
我得到
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396
解析此类响应的最佳实践是什么?
另一个问题:我如何构建对象,它可以识别不时作为整数或字符串返回的整数变量?同样的服务器端问题。
"data": "1"
或者
"data": 1
我知道——我们应该在 Java 中使用特定类型。但有时值得做出让步,
谢谢
编辑:我的解决方案基于 Java 开发人员的答案。
ServiceDeserializer 类根据每个对象的内部值反序列化每个对象。
public class ServiceDeserializer implements JsonDeserializer<ServiceState>{
@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
您可以提供自定义解串器。由于我们知道它service
要么是基本json
字符串的属性,要么嵌入到其他字符串中property
,因此我们可以使用反序列化器逐步解析出有问题的组件并相应地处理它们。
public class MyJsonDeserializer implements JsonDeserializer<YourParsedData> {
@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);
我把所有这些都打出来了,所以如果我错过了一些语法,我很抱歉。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/685768/0a8ab92348913043f9c8/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!