2017-07-03 4 views
1

Ich habe eine Java-App, die JSON-Inhalte an meinen Server (C++) senden. Ich mein Server Ich erhalte die JSON, die Parsing, die Validierung, etc und senden Sie die Antwort mit JSON auch. Ich habe eine Anfrage in meiner Java-Anwendung, die diese json Körper (Beispiel) hat:GSON Deserialize/Serialize Hierarchie-Klasse

{ 
    "a": "a", 
    "b": "b", 
    "searchMethod": { 
     "searchByUser": { 
      "userId": "userId" 
     } 
    } 
} 

Aber für den gleichen Befehl kann ich andere searchMethod:

{ 
    "a": "a", 
    "b": "b", 
    "searchMethod": { 
     "searchByEmail": { 
      "email": "[email protected]" 
     } 
    } 
} 

Also, wenn der Benutzer das tun Anfrage können wir einen dieser zwei verschiedenen JSON-Bodys an meinen Server senden. Ich weiß nie was searchMethod wir senden. Dieser Teil (check what searchMethod der Benutzer senden, etc), mache ich in meinem C++ Server, wenn ich den JSON erhalte. Also, in meiner Java-App muss ich nur das Gson verwenden, um ein searchMethod Objekt mit ihrem Inhalt zu senden.

Das ist meine Klasse, die Anforderung zu tun:

public class RequestExample implements SerializableJSON 
{ 
    public String a; 
    public String b; 

    public RequestExample(String a, b) 
    { 
     this.a = a; 
     this.b = b; 
    } 

    public static RequestExample fromStringJson(String data) 
    { 
     try 
     { 
      Gson gson = new Gson(); 
      return gson.fromJson(data, RequestExample.class); 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 
    } 

    public static RequestExample fromBytesJson(byte[] data) 
    { 
     if (data == null) return null; 
     try 
     { 
      String str = new String(data, "utf-8"); 
      return fromStringJson(str); 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 

    @Override 
    public String toJsonString() 
    { 
     try 
     { 
      Gson gson = new Gson(); 
      return gson.toJson(this); 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 
    } 

    @Override 
    public byte[] toJsonBytes() 
    { 
     try 
     { 
      return this.toJsonString().getBytes("utf-8"); 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 
} 

ich implementieren bereits die Felder a und b, weil sein immer das gleiche in diesem Antrag. In dieser Klasse empfängt die fromStringJson(String data) das Datenzeichenfolgenfeld, das alle json enthält, die der Benutzer zu senden versucht. In dieser Funktion verwende ich die gson.fromJson, um diese Zeichenfolge in einen Json-Objekttyp meiner RequestExample Klasse zu konvertieren.

Also die Hauptfrage ist: Wie kann ich meine RequestExample Klasse anpassen, um die Zeichenfolge in ein JSON-Objekt unabhängig von dem Typ searchMethod zu konvertieren. Wie ich in meiner Java-App gesagt habe, muss ich nicht wissen, wie seachMethod der Benutzer wählt. In meinem Server ja, aber diesen Teil habe ich bereits implementiert. Im Moment muss ich die Anfrage nur an meinen Server senden.

Antwort

1

Wenn Sie nicht Feld verwenden Sie searchMethod, können Sie es wie ein für die Antwort Map

private Map<String, Object> searchMethod = new HashMap<>(); 

or 

private Map<String, Map<String,Object>> searchMethod = new HashMap<>(); 

or 

private Map<String, Map<String,String>> searchMethod = new HashMap<>(); 
+0

Dank implementieren kann. Ich verstehe deinen Code, aber ich habe einen Zweifel. Was ist das Objekt? searchByUser oder searchByEmail? In dieser Karte muss ich ein Objekt in Ordnung definieren, aber ich weiß nicht, welche Art von Objekt der Benutzer wählt. Verstehst du meine Zweifel? Derselbe Befehl kann searchByUser oder searchByEmail haben. Wenn ich meine String-Daten erhalte, weiß ich nicht, was searchMethod der Benutzer – RMRMaster

+0

tut. Ich brauche nicht Benutzer Java Hiearchie. Ich kann nur eine Karte wie diese verwenden: Map > searchMethod, weil die Bewertung über den JSON-Inhalt ich auf meinem Server mache. Mit dieser Methode kann ich den searchMethod und den internen C++ Server senden. Ich parse den JSON und mache die Validierungen :) – RMRMaster

+0

Wie ich verstanden habe, hast du eine Lösung gefunden, also habe ich die Antwort für andere Leute bearbeitet. –