首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合对象类型的Gson反序列化

混合对象类型的Gson反序列化
EN

Stack Overflow用户
提问于 2015-05-15 13:51:44
回答 1查看 1.2K关注 0票数 1

我有一个JSON:

代码语言:javascript
复制
"account_representatives": [
      {
        "Sales Person": 1307,
        "default_ticket_assignments": [
          ""
        ],
        "Primary Account Manager": 1307,
        "Secondary Support-3": 1151,
        "Relationship Mgr": 1307,
        "authorized_resources": [
          ""
        ],
        "Technical Account Manager": 164
      }
    ]

我有一门课的结构是这样的:

代码语言:javascript
复制
public class AccountRepresentative {

        @SerializedName("authorized_resources")
        @Expose
        private List<String> authorizedResources = new ArrayList<String>();
        @SerializedName("default_ticket_assignments")
        @Expose
        private List<String> defaultTicketAssignments = new ArrayList<String>();
        @Expose
        private Map<String, String> repFields;

        /**
         * @return The authorizedResources
         */
        public List<String> getAuthorizedResources() {
            return authorizedResources;
        }

        /**
         * @param authorizedResources The authorized_resources
         */
        public void setAuthorizedResources(List<String> authorizedResources) {
            this.authorizedResources = authorizedResources;
        }

        /**
         * @return The defaultTicketAssignments
         */
        public List<String> getDefaultTicketAssignments() {
            return defaultTicketAssignments;
        }

        /**
         * @param defaultTicketAssignments The default_ticket_assignments
         */
        public void setDefaultTicketAssignments(List<String> defaultTicketAssignments) {
            this.defaultTicketAssignments = defaultTicketAssignments;
        }

        /**
         *
         * @return the dynamic jsonObjects
         */
        public Map<String, String> getRepFields() {
            return repFields;
        }

        /**
         * @param repFields The repFields
         */
        public void setRepFields(Map<String, String> repFields) {
            this.repFields = repFields;
        }
    }

我使用GSON来绑定这些,我能够绑定2 JsonArrays。

我还可以使用jsonArrays反序列化动态属性w/o,

但是在这种情况下,我不知道如何获得动态属性,我的计划应该是将动态属性转换为hashmap,但是2 jsonArrays阻碍了。

谢谢你的帮助,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 11:11:58

我了解了如何使用GSON自定义反序列化器,多亏了这篇文章,Using GSON to parse array with multiple types,还有这篇文章,java collections - keyset() vs entrySet() in map,我所做的就是创建这个自定义反序列化器:

代码语言:javascript
复制
package com.xxx.xyz.models;

import android.util.Log;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class AccountRepresentativeDeserializer implements JsonDeserializer<AccountDetailsModel.AccountRepresentative> {
    @Override
    public AccountDetailsModel.AccountRepresentative deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Log.v("AUTHORIZED REP ", json.toString());
        AccountDetailsModel.AccountRepresentative accountRep = new AccountDetailsModel().new AccountRepresentative();
        JsonObject jObject = json.getAsJsonObject();
        Set<Entry<String, JsonElement>> items = jObject.entrySet();
        Iterator<Entry<String, JsonElement>> it = items.iterator();
        Map<String, String> repFields = new HashMap<>();

        while (it.hasNext()) {
            Entry<String, JsonElement> i = it.next();
            if (i.getKey().equals("default_ticket_assignments")) {
                ArrayList<String> defaultTicketAssignments = new ArrayList<>();
                JsonArray defTicketAssignment = i.getValue().getAsJsonArray();
                Iterator<JsonElement> defTicketIterator = defTicketAssignment.iterator();

                while (defTicketIterator.hasNext()) {
                    JsonElement defTicketItem = defTicketIterator.next();
                    defaultTicketAssignments.add(defTicketItem.getAsString());
                }
                accountRep.setDefaultTicketAssignments(defaultTicketAssignments);
            } else if (i.getKey().equals("authorized_resources")) {
                ArrayList<String> authorizedResources = new ArrayList<>();
                JsonArray authorizedRes = i.getValue().getAsJsonArray();
                Iterator<JsonElement> authorizedResIterator = authorizedRes.iterator();

                while (authorizedResIterator.hasNext()) {
                    JsonElement defTicketItem = authorizedResIterator.next();
                    authorizedResources.add(defTicketItem.getAsString());
                }
                accountRep.setAuthorizedResources(authorizedResources);
            } else {
                repFields.put(i.getKey(), i.getValue().getAsString());
            }
        }
        accountRep.setRepFields(repFields);
        return accountRep;
    }
}

然后像这样使用它:

代码语言:javascript
复制
Gson gson = new GsonBuilder().registerTypeAdapter(AccountDetailsModel.AccountRepresentative.class, new AccountRepresentativeDeserializer()).create();
                        AccountDetailsModel result = gson.fromJson(strResult, AccountDetailsModel.class);

顺便说一句,AccountRepresentative是一个内部类,AccountRepresentative中的两个数组总是在JSON中,只有属性是动态的。

我以为我无法解析内部反序列化器并为AccountDetailModel本身定制反序列化器,但是我尝试为AccountRepresentative创建反序列化器,它运行得很好:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30261226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档