2017-07-03 74 views
1

我有一個Java應用程序發送json內容到我的服務器(C++)。我的服務器,我收到的JSON,做解析,驗證等,併發送響應與JSON了。 我在我的Java應用程序一個要求,即有此JSON體(例如):GSON反序列化/序列化層次類

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

但相同的命令,我可以有其他searchMethod

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

因此,當用戶做要求我們可以向我的服務器發送這兩個不同的json bodys中的一個。我永遠不知道我們發送了什麼searchMethod。這部分(檢查用戶發送的searchMethod是什麼等),當我收到json時,我在我的C++服務器上執行操作。所以在我的Java應用程序中,我只需要使用gson發送一個searchMethod對象與他們的內容。

這是我班的要求去做:

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

我已經實現了領域ab,因爲它總是在這個要求是相同的。在這個類中,fromStringJson(String data)接收包含用戶嘗試發送的所有json的數據字符串字段。在這個函數中,我使用gson.fromJson將這個字符串轉換爲我的RequestExample類的json對象類型。

所以主要問題是:如何適應我的RequestExample類將字符串轉換爲json對象,而不管searchMethod的類型如何。就像我在我的Java應用程序中所說的,我不需要知道用戶如何選擇seachMethod。在我的服務器是,但這部分我已經實現。所以現在,我只需要將請求發送到我的服務器。

回答

1

如果你不使用現場searchMethod,可以實現它像一個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

感謝您的答覆。我瞭解你的代碼,但我有一個疑問。什麼是對象? searchByUser還是searchByEmail?在這張地圖中,我需要定義一些對象,但我不知道用戶選擇的對象類型。你明白我的疑問嗎?同樣的命令可以有searchByUser或searchByEmail ..當我收到我的字符串數據時,我不知道用戶放什麼searchMethod – RMRMaster

+0

對不起。我不需要用戶java hiearchy。我只能使用像這樣的地圖: Map > searchMethod,因爲我的服務器中的json內容有關的閥值。通過這種方式,我可以發送searchMethod和內部的c + +服務器我解析json並進行驗證:) – RMRMaster

+0

據我瞭解,您找到了解決方案,所以我編輯了其他人的答案 –