2016-05-10 6 views
0

Я хочу разобрать json для объекта, который дает мне данные о каждой сущности, прикрепленной к банку.Как обрабатывать несколько json-полей в gson

Мой JSON выглядит следующим образом:

{ 
    "href" : "abc", 
    "configurations" : 
    [ 
     { 
      "type" : "bank-customer", 
      "properties" : { 
       "cust-name" : "foo", 
       "acc-no" : "12345" 
      } 
     }, 
     { 
      "type" : "bank-employee", 
      "properties" : { 
       "empl-name" : "foo", 
       "empl-no" : "12345" 
      } 
     } 
    ] 
} 

свойства для различных "типа" сущности отличается.

Создание pojo для этого - задача. Мой properties.java будет включать в себя все свойства, независимо от вида собственности:

public class Configurations { 
    @SerializedName("type") 
    @Expose 
    private String entityType; 
    @SerializedName("properties") 
    @Expose 
    private Properties properties; 
} 

public class Properties { 
    @SerializedName("cust-name") 
    @Expose 
    private String custName; 
    @SerializedName("empl-no") 
    @Expose 
    private String emplNo; 
    @SerializedName("empl-name") 
    @Expose 
    private String emplName; 
    @SerializedName("acc-no") 
    @Expose 
    private String accNo; 
} 

Это больно, когда у меня есть много типов объектов и имущество каждого типа объекта. Есть ли другой способ, которым я могу разобрать этот json в разные объекты свойств для разных типов сущностей? Я использую gson для разбора JSON

Примечание: Я не могу вносить какие-либо изменения в сам json.

+0

Вы можете поменять свой класс Properties на карту - тогда вы сможете анализировать все типы «сущностей» - но вам все равно нужно обрабатывать разные типы где-то – anders

ответ

0

Возможно, вам необходимо создать собственный десериализатор, взгляните на это example.

Возможная реализация

десериализатор:

package it.test.gson; 

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

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; 

public class BankDeserializer implements JsonDeserializer<Bank> { 

    @Override 
    public Bank deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { 
     final JsonObject jsonObject = json.getAsJsonObject(); 

     final JsonElement jsonHref = jsonObject.get("href"); 
     final String href = jsonHref.getAsString(); 

     final JsonArray jsonConfigurationsArray = jsonObject.get("configurations").getAsJsonArray(); 
     final String[] configurations = new String[jsonConfigurationsArray.size()]; 
     List<IPerson> persons = new ArrayList<>(); 
     for (int i = 0; i < configurations.length; i++) { 
      final JsonElement jsonConfiguration = jsonConfigurationsArray.get(i); 
      final JsonObject configJsonObject = jsonConfiguration.getAsJsonObject(); 
      final String type = configJsonObject.get("type").getAsString(); 
      final JsonObject propertiesJsonObject = configJsonObject.get("properties").getAsJsonObject(); 
      IPerson iPerson = null; 
      if (type.equals("bank-customer")) { 
       iPerson = new Customer(); 
       final String name = propertiesJsonObject.get("cust-name").getAsString(); 
       final String no = propertiesJsonObject.get("acc-no").getAsString(); 
       iPerson.setName(name); 
       iPerson.setNo(no); 
      } else if (type.equals("bank-employee")) { 
       iPerson = new Employee(); 
       final String name = propertiesJsonObject.get("empl-name").getAsString(); 
       final String no = propertiesJsonObject.get("empl-no").getAsString(); 
       iPerson.setName(name); 
       iPerson.setNo(no); 
      } 
      persons.add(iPerson); 
     } 

     final Bank bank = new Bank(); 
     bank.setHref(href); 
     bank.setConfiguration(persons.toArray(new IPerson[0])); 
     return bank; 
    } 
} 

POJOs:

Банк

package it.test.gson; 

public class Bank { 

    private String href; 
    private IPerson[] configuration; 

    public String getHref() { 
     return href; 
    } 

    public void setHref(String href) { 
     this.href = href; 
    } 

    public IPerson[] getConfiguration() { 
     return configuration; 
    } 

    public void setConfiguration(IPerson[] configuration) { 
     this.configuration = configuration; 
    } 

} 

Интерфейс для лиц

package it.test.gson; 

public interface IPerson { 

    public String getName(); 
    public void setName(String name); 
    public String getNo(); 
    public void setNo(String no); 

} 

Осуществление лиц, ваш сотрудник или клиент

package it.test.gson; 

public class Customer implements IPerson { 

    private String name; 
    private String no; 

    @Override 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public void setNo(String no) { 
     this.no = no; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public String getNo() { 
     return no; 
    } 

} 

package it.test.gson; 

public class Employee implements IPerson { 

    private String name; 
    private String no; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setNo(String no) { 
     this.no = no; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public String getNo() { 
     return no; 
    } 

} 

и Основной класс, чтобы проверить это

package it.test.gson; 

import java.io.InputStreamReader; 
import java.io.Reader; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     // Configure Gson 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Bank.class, new BankDeserializer()); 
     Gson gson = gsonBuilder.create(); 

     // The JSON data 
     try (Reader reader = new InputStreamReader(Main.class.getResourceAsStream("/part1/sample.json"), "UTF-8")) { 
      // Parse JSON to Java 
      Bank bank = gson.fromJson(reader, Bank.class); 

      System.out.println(bank.getHref()); 
      //... 
     } 
    } 
} 

Я надеюсь, что это помогает.

0

Я полностью согласен с ответом mauros.

Но вы также можете создать иерархию интерфейса и реализовать Instance Creator.

0

Его можно легко решить, используя ключевое слово alternate из @SerializedName аннотация.

public class Properties { 

    @SerializedName(value="cust-name", alternate={"empl-name", "user-name"}) 
    @Expose 
    private String name; 

    @SerializedName("acc-no", alternate={"empl-no", "user-id"}) 
    @Expose 
    private String id; 

    //setter and getters 
} 

happyCoding;

Смежные вопросы