2013-07-07 72 views
0

我有一些關於gson編碼的問題。 我有發送如下JSON響應一個web服務:Jersey REST字符編碼

{ 
    "version": "v2", 
    "result": { 
     "class": "SearchSizeBean", 
     "result_list": [ 
      { 
       "id": 0, 
       "name": "Bitte w\u00c3\u00a4hlen" 
      }, 
      { 
       "id": "21", 
       "name": "176" 
      } 
     ] 
    } 
} 

我請求與下面的代碼的web服務:

ClientResponse response = webResource.path(version) 
      .path(path) 
      .accept(MediaType.APPLICATION_JSON) 
      .method(method.name(), ClientResponse.class, paramMap); 

if (response.getStatus() == 200) 
{ 
    responseBody = response.getEntity(String.class); 
    ... 
} 

當檢查responseBody得到的字符串示出的完全一樣JSON上述相同的結果。但是,使用GSON將JSON字符串轉換爲對象之後,字符轉換錯誤:

與GSON解析:

Gson gson = new GsonBuilder().disableHtmlEscaping() 
      .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
      .registerTypeAdapter(Transferable.class, new TransferableDeserializer()) 
      .setDateFormat("yyyy-MM-dd HH:mm:ss") 
      .create(); 

RestResponse responseDTO = gson.fromJson(responseBody, RestResponse.class); 

得到的內容:

Response: SearchSizeBean[ 
       resultList={ 
        PosSize [id=0, name=Bitte wählen], 
        PosSize [id=21, name=176] 
       } 
      ] 

UPDATE:

我複製了錯誤的JSON內容。我編輯了JSON以顯示正確的JSON字符串。數據以unicode w\u00c3\u00a4發送。當我通過GSon檢查轉換後的響應時,它變爲十六進制:C3 82 C2 A4

+1

'「name」:「Bittewählen」' - 應該是wählen,對不對?數據看起來像UTF-8解碼爲windows-1252。我首先要驗證服務中的數據。當您查看十六進制編輯器中的原始響應字節時,應將其編碼爲UTF-8中的「C3 A4」。 – McDowell

+0

你如何得到你在這個問題的頂部顯示的字符串?你提到responseBody有同樣的事情。這是否意味着你做了System.out.println(responseBody)並在打印的內容中看到了「\ u00c3 \ u00a4」? – Pace

+2

'「Bitte w \ u00c3 \ u00a4hlen」'是Bittewählen的Unicode轉義表示。 Bittewählen將會是''Bittewühüehlen''。 – McDowell

回答

1

問題出在服務器端的php代碼。我有一個腳本,它已經用UTF-8編碼。我用php函數utf8_encode()編碼了字符串「Bittewählen」,這導致了我的問題。

謝謝麥克道威爾,你的提示使我走上正軌!

解決方案是而不是使用該函數並只發送字符串「Bittewählen」。