2013-07-07 44 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”。