【问题标题】:Handling gson with dynamic array and Object使用动态数组和对象处理 gson
【发布时间】:2016-07-07 04:48:48
【问题描述】:

我从 API 获得响应,如果存在数据,则返回对象,而当数据不存在时,则返回空白数组。 我有用于序列化的模型类。 这是模型类

    @SerializedName("local")
    public Local _local  = new Local();     
     public class Local{
      @SerializedName("total")
            public String _total;

            @SerializedName("providers")
            public  ArrayList<ProvidersDetails> _providers = new ArrayList<>();

            public class ProvidersDetails{
                @SerializedName("id")
                public String _id;

                @SerializedName("image")
                public String _image;

            }

            @SerializedName("admin")
            public transient Admin admin = new Admin();

            public class Admin{

               @SerializedName("id")
                public String _id;

                @SerializedName("first_name")
                public String _first_name;

                @SerializedName("last_name")
                public String _last_name;

            }

           @SerializedName("orgn")
            public Organization _organization = new Organization();

            public class Organization{
                @SerializedName("name")
                public String _ name;
            }
        }

这是我从 api 得到的部分响应

       "local":{
       "providers":[
        {
        "id":"1180",  
       "image":"photo.png"
        },
         {
        "id":"1180",  
       "image":"photo.png"
         },
         {
        "id":"1180",  
       "image":"photo.png"
        }
        ],
       "admin":{
       "id":"1180",
      "first_name":"nqgnerq",
       "last_name":"gnejbeqp",
      },
     "orgn":{
      "name":"organization name"
      }
      }

这是当数据不存在时我得到的另一种形式

     "local":{
     "total":0,
     "providers":[
     ],
     "admin":[
      ],
    "orgn":{
      "name":"organization name"
      }
     }

我已经检查了许多解决方法,但都失败了,因为我想在我的 pojo 课程中处理它。有没有人有解决方案,请提出建议。

【问题讨论】:

  • 为什么不用optString()手动解析呢?

标签: android json parsing gson


【解决方案1】:

您可以使用“JsonDeserializer”来处理它。这是一个示例。 上课ProvidersDetails implements Serializable

像这样创建一个新类

public class ProvidersDetailsList {
    public ArrayList<ProvidersDetails> getDetails() {
        return providersDetails;
    }

    ArrayList<ProvidersDetails> providersDetails= new ArrayList<>();
}

现在编写反序列化器。

 public class PhotoAlbumDeserializer implements JsonDeserializer {

        @Override
        public Object deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
            ProvidersDetailsList providersDetailsList= new ProvidersDetailsList ();

            JsonObject jsonObject = jsonElement.getAsJsonObject();
            if (jsonObject != null) {

                JsonElement usersField = jsonElement.getAsJsonObject().get("providers");
                if (usersField == null || usersField.isJsonNull() || usersField.isJsonPrimitive())
                    ; // if is null or is a primitive type will return an empty result
                else if (usersField.isJsonObject()) {
                    providersDetailsList.getDetails().add((ProvidersDetails) jsonDeserializationContext.deserialize(usersField, ProvidersDetails.class));

                } else if (usersField.isJsonArray()) {
                    Type listOfUserType = new TypeToken<List<ProvidersDetails>>() {
                    }.getType();
                    providersDetailsList.getDetails().addAll((Collection<? extends ProvidersDetails>) jsonDeserializationContext.deserialize(usersField, listOfUserType));
                }

            }
            return providersDetailsList;
        }
    }

现在这样称呼它

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ProvidersDetailsList.class, new PhotoAlbumDeserializer());
Gson gson = gsonBuilder.create();
ArrayList<ProvidersDetails> providersDetails = gson.fromJson(jsonString, ProvidersDetailsList.class);

这是使用 Gson https://stackoverflow.com/a/16591621/3111083 进行操作的链接

【讨论】:

  • 您能否根据我的回复更改它,因为我无法更改它,因为我在对象中有数组并且它很复杂。请这样做
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2010-09-20
  • 2015-03-14
  • 2020-11-18
相关资源
最近更新 更多