2016-05-10 12 views
0

Ich möchte ein JSON zu einem Objekt analysieren, die mir Details über jede Entität gibt, die an eine Bank angeschlossen ist.Wie behandelt man mehrere JSON-Felder in Gson

Mein json wie folgt aussieht:

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

Die Eigenschaften für verschiedene Unternehmen "Typ" ist anders.

Erstellen Sie einen Pojo dafür ist die Herausforderung. Mein properties.java alle Eigenschaften unabhängig von der Art der Unterkunft zählen müssen:

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

Diese schmerzhaft ist, wenn ich eine Menge von Objekttypen und Objekt pro Entitätstyp haben. Gibt es eine andere Möglichkeit, dieses JSON für verschiedene Entitätstypen in verschiedene Eigenschaftsobjekte zu parsen? Ich benutze Gson, um den JSON zu analysieren

Hinweis: Ich kann keine Änderungen am JSON selbst vornehmen.

+0

Sie könnten Ihre Properties-Klasse gegen eine Map austauschen - dann können Sie alle Arten von "Entity-Typen" parsen - aber Sie müssen die verschiedenen Typen irgendwo handhaben – anders

Antwort

0

Sie müssen wahrscheinlich Ihre eigenen Deserializer erstellen, werfen Sie einen Blick auf diese example.

Eine mögliche Implementierung

Deserializer:

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:

Bank

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

} 

Schnittstelle für Personen

package it.test.gson; 

public interface IPerson { 

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

} 

Implementierung von Personen, Ihre Mitarbeiter oder Kunde

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

} 

und die Hauptklasse es

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()); 
      //... 
     } 
    } 
} 

Ich hoffe, zu testen, es hilft.

0

Ich stimme voll und ganz mit der Antwort von Mauros überein. Sie können auch eine Schnittstellenhierarchie erstellen und Instance Creator implementieren.

0

Es kann einfach gelöst werden mit alternate Schlüsselwort aus @SerializedName Annotation.

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;

Verwandte Themen