Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用自定义Gson反序列化器解析对象的嵌套JSON数组?_Android_Gson - Fatal编程技术网

Android 如何使用自定义Gson反序列化器解析对象的嵌套JSON数组?

Android 如何使用自定义Gson反序列化器解析对象的嵌套JSON数组?,android,gson,Android,Gson,大家好。我理解这一点有点困难。我有一个JSON,看起来像这样: { "data": [ { "id": "43", "type": "position", "attributes": { "address-id": "1", "employer-id": "11" } } ], "included"

大家好。我理解这一点有点困难。我有一个JSON,看起来像这样:

  {
      "data": [
        {
          "id": "43",
          "type": "position",
          "attributes": {
            "address-id": "1",
            "employer-id": "11"
          }
        }
      ],
      "included": [
        {
          "id": "1",
          "type": "address",
          "attributes": {
            "line-1": "21 london london",
            "line-2": "",
            "line-3": "",
            "locality": "",
            "region": "London",
            "post-code": "",
            "country": "UK",
            "latitude": "",
            "longitude": ""
          }
        },
        {
          "id": "11",
          "type": "employer",
          "attributes": {
            "title": "Mr",
            "first-name": "S",
            "last-name": "T"
          }
        }
      ]
    }
我的改装电话是:

 @GET("/api/positions")
 Single<PositionResponse> getPosition();
现在想象一下,它有更多的数据。如何创建自定义TypeAdapter或JsonDeserializer来解析列表?出于某种原因,我可以为对象创建一个自定义JsonDeserializer或TypeAdapter,但当涉及到列表时,我似乎无法让它工作

我的TypeAdapter如下所示:

公共类IncludedTypeAdapter扩展了TypeAdapter{ @凌驾 public void writeJsonWriter out,ArrayList值抛出IOException{ } @凌驾 抛出IOException中的公共ArrayList readJsonReader{ ArrayList=新的ArrayList; IncludedModel=新的IncludedModel; Gson Gson=新Gson; in.beginArray; 字符串id=null; //in.beginObject; whilein.hasNext{ JsonToken nextToken=in.peek; ifJsonToken.BEGIN\u OBJECT.equalsnextToken{ in.beginObject; }else ifJsonToken.NAME.equalsnextToken{ ifJsonToken.NAME.NAME.equalsid{ id=in.nextString; model.setIdid; }else ifJsonToken.NAME.NAME.equalstype{ 字符串类型=in.nextString; model.setMytypetype; 开关类型{ 案例BaseModelType。雇主: EmployerResponse employer=gson.fromJsonin,EmployerResponse.class; model.setEmployeerEmployer; 打破 } } } } list.addmodel; 退货清单; } 我向我的Gson注册:

  GsonBuilder gsonBuilder = new GsonBuilder();
      gsonBuilder.registerTypeAdapter(IncludeModel.class, new IncludedTypeAdapter());
     //gsonBuilder.registerTypeAdapter(new IncludedTypeAdapter());
      gsonBuilder.serializeNulls();
      Gson gson = gsonBuilder.create();

      return gson;
我通过GsonConverterFactory在改装时注册了它

我得到:

应为BEGIN_数组,但在第1行第6292列path$处为BEGIN_对象。包括[0]

我怀疑这是因为我的改装响应是JsonObject


总结一下我的问题:如何使用我自己的自定义类型适配器反序列化列表对象,记住我的改装服务的响应类型是PositionResponse?非常感谢您的患者和回答。

如果您使用JsonDeserializer使用JSON树模型,这很容易。纯类型适配器也有点过火是的,我认为,因为它仍然是面向树的,在JSON文档最简单的情况下,您可以使用类似的方法进行更多的解释,但您的情况略有不同

我假设您希望有如下映射:

抽象类元素{ 最终字符串id=null; 私有元素{ } 静态最终类地址 扩展元素{ @SerializedNameline-1最终字符串line1=null; @SerializedNameline-2最终字符串line2=null; @SerializedNameline-3最终字符串line3=null; @SerializedNamelocality最终字符串位置=null; @SerializedNameregion最终字符串区域=null; @SerializedNamepost代码最终字符串postCode=null; @SerializedNamecountry最终字符串country=null; @SerializedNamelatitude最终字符串latitude=null; @SerializedName经度最终字符串经度=null; 私人地址{ } @凌驾 公共字符串toString{ 返回国家/地区; } } 静态最终类雇主 扩展元素{ @SerializedNametitle最终字符串title=null; @SerializedNameFirstName最终字符串firstName=null; @SerializedNamelast name最终字符串lastName=null; 私人雇主{ } @凌驾 公共字符串toString{ 返回title+''+firstName+''+lastName; } } 静态最终类位置 扩展元素{ @SerializedNameAddressID最终字符串addressId=null; @SerializedNameemployer id最终字符串employerId=null; 私人职位{ } @凌驾 公共字符串toString{ return+addressId+';'+employerId+; } } } 你所要做的只是:

确定预期的对象类型; 如果JSON树符合您的需要,请对齐它; 只需通过反序列化上下文将反序列化工作委托给Gson您的示例做得不好:您再次实例化Gson,丢失了原始配置;您重新执行了Gson可以做的所有开箱即用的事情:通过反射列表和POJO;如果通过开关检查枚举是单例的,那么JsonToken会更好y legal使用参考等式对其进行比较 等。 因此,它可以通过以下方式实现:

最终类ElementJsonDeserializer 实现JsonDeserializer{ 私有静态最终JsonDeserializer elementJsonDeserializer=new elementJsonDeserializer; 私有元素JSONDESerializer{ } 静态JsonDeserializer getElementJsonDeserializer{ 返回元素JSONDESerializer; } @凌驾 公共元素反序列化final JsonElement JsonElement,final类型,final JsonDeserializationContext上下文 抛出JsonParseException{ 最终JsonObject JsonObject=jsonElement.getAsJsonObject; 最终字符串typeCode=jsonObject.getAsJsonPrimitivetype.getAsString;
final Class为什么需要自定义适配器?如果您的模型与json匹配,通常不需要。@nasch,因为如果查看include对象,类型会动态更改,服务器返回的是其中的其他嵌套对象,如JSONAPI格式的关系标记,我会有很多难以维护的模型类ntain,因此最好在自定义模型中映射它们。如果可能的话,也是为了学习目的。非常感谢!也感谢您发送的其他链接中的信息。我会尝试一下并让您知道。很抱歉反应太晚。很有效!!…非常感谢您的帮助和信息。学到了一些新的东西!