2013-04-08 82 views
0

我正在向發送JSON字符串的HTTP服務器發送請求。我使用Gson序列化和反序列化JSON對象。今天,我觀察到這個我不明白的奇怪行爲。字符串對象與Java中的OutputStreamWriter中的字符串字面量

我:

String jsonAsString = gson.toJson(jsonAsObject).replace("\"", "\\\""); 
System.out.println(jsonAsString); 

輸出正是這一點:

{\"content\":\"Literal\",\"pos\":{\"left\":20,\"top\":20}} 

現在我使用的是從HttpURLConnection獲得OutputStreamWriter來進行HTTP,JSON的有效載荷PUT請求。上述請求正常工作:

os.write("{\"content\":\"Literal\",\"pos\":{\"left\":20,\"top\":20}}"); 

然而,當我說:

os.write(jsonAsString); 

...請求不工作(此服務器不返回任何錯誤,但我可以看到,當把JSON寫成字符串對象,它不會做它應該做的)。在字符串對象上使用字符串時,是否有區別。難道我做錯了什麼?

下面是摘錄:

public static void EditWidget(SurfaceWidget sw, String widgetId) { 
     Gson gson = new Gson(); 
     String jsonWidget = gson.toJson(sw).replace("\"", "\\\""); 

     System.out.println(jsonWidget); 

     try { 
      HttpURLConnection hurl = getConnectionObject("PUT", "http://fltspc.itu.dk/widget/5162b1a0f835c1585e00009e/"); 
      hurl.connect(); 
      OutputStreamWriter os = new OutputStreamWriter(hurl.getOutputStream()); 
      //os.write("{\"content\":\"Literal\",\"pos\":{\"left\":20,\"top\":20}}"); 
      os.write(jsonWidget); 
      os.flush(); 
      os.close(); 
      System.out.println(hurl.getResponseCode()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

回答

4

取出.replace("\"", "\\\"")指令。這是沒有必要的。

你不得不當你發送一個JSON字符串字面雙引號前加斜槓,因爲在一個Java字符串字面,雙引號必須轉義(否則,他們將標誌着字符串的結束,而不是在String中是雙引號)。

但是字節碼中的實際字符串不包含這些反斜槓。它們只用於源代碼中。