2015-05-15 196 views
1

我有一个JSON:GSON反序列化

"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 
     } 
    ] 

,我有一个类,它的结构是这样的:

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。

我也可以W/O的jsonArrays使用How can I convert JSON to a HashMap using Gson?

但在这种情况下,反序列化的动态性能,我不知道怎么弄的动态特性, 我的计划据说是把动态特性为hashmap,但2 jsonArrays的方式。

感谢您的帮助,

+0

你的意思是比如说,你不确定'键值对'的关键?它可以改变,恕不另行通知? –

+0

是的..钥匙是动态的,所以我不能在飞行中抓住他们 – Keiichi

回答

0

我已经找到了如何使用GSON定制解串器感谢这个帖子,Using GSON to parse array with multiple types,也是这个帖子,java collections - keyset() vs entrySet() in map 我所做的是创建这个定制解串器:

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; 
    } 
} 

然后使用它像这样:

Gson gson = new GsonBuilder().registerTypeAdapter(AccountDetailsModel.AccountRepresentative.class, new AccountRepresentativeDeserializer()).create(); 
         AccountDetailsModel result = gson.fromJson(strResult, AccountDetailsModel.class); 

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

我想我将无法解析内部一个,并为AccountDetailModel本身的自定义解串器,但我想以创建AccountRepresentative解串器,它都很好:)