程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

GSON解析未指定类型变量

发布于2023-12-25 22:23     阅读(708)     评论(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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)