JSONObject包含转义字符

我正在构建一个模拟器来将JSON数据发布到我正在运行的服务中。

JSON应该如下所示:

{"sensor": {"id":"SENSOR1","name":"SENSOR","type":"Temperature","value":100.12,"lastDateValue":"\/Date(1382459367723)\/"} } 

我在Chrome中使用“高级REST客户端”尝试了这个,这很好用。 ServiceStack Web服务正确解析日期。

因此,重点是编写一个传感器模拟器,将这样的数据发布到Web服务。

我用Java创建了这个,所以我可以在我的覆盆子pi上运行它。

这是代码:

  public static void main(String[] args) { String url = "http://localhost:63003/api/sensors"; String sensorname = "Simulated sensor"; int currentTemp = 10; String dateString = "\\" + "/Date(" + System.currentTimeMillis() + ")\\" + "/"; System.out.println(dateString); System.out.println("I'm going to post some data to: " + url); //Creating the JSON Object JSONObject data = new JSONObject(); data.put("id", sensorname); data.put("name", sensorname); data.put("type", "Temperature"); data.put("value", currentTemp); data.put("lastDateValue", dateString); JSONObject sensor = new JSONObject().put("sensor", data); //Print out the data to be sent StringWriter out = new StringWriter(); sensor.write(out); String jsonText = out.toString(); System.out.print(jsonText); //Sending the object HttpClient c = new DefaultHttpClient(); HttpPost p = new HttpPost(url); p.setEntity(new StringEntity(sensor.toString(), ContentType.create("application/json"))); try { HttpResponse r = c.execute(p); } catch (Exception e) { e.printStackTrace(); } } 

该计划的输出如下:

 \/Date(1382459367723)\/ I'm going to post some data to: http://localhost:63003/api/sensors {"sensor":{"lastDateValue":"\\/Date(1382459367723)\\/","id":"Simulated sensor","name":"Simulated sensor","value":10,"type":"Temperature"}} 

这里的问题是JSONObject字符串仍然包含这些转义字符。 但是当我在开头打印字符串时,它不包含转义字符。 有没有办法摆脱这些? 我的服务无法解析这些..

这是我在chrome中与其他客户端一起发送的示例:

  {"sensor":{"id":"I too, am a sensor!","name":"Willy","type":"Temperature","value":100.12,"lastDateValue":"\/Date(1382459367723)\/"}} 

JSONObject正确编码字符串。 此页面描述了如何在JavaScript(以及扩展名为JSON)中转义字符串文字。 以下注释对于了解示例中发生的情况非常重要:

对于表2.1中未列出的字符,将忽略前面的反斜杠,但不推荐使用此用法。

您的示例( "\/Date(1382459367723)\/" )在/之前使用前面的反斜杠。 因为/不在表2.1中,所以应该简单地忽略\ 。 如果你的服务没有忽略\ ,那么它有一个bug,或者不是一个JSON解析器(也许它使用的数据格式与JSON类似,但不完全相同)。

由于您需要生成不符合要求的JSON,因此您将无法使用标准工具来执行此操作。 您的两个选择是编写自己的非JSON编码器,或者避免必须转义的字符,例如\"

@pburka是对的。 如果你想以\/Date(1382459367723)\/ format发送它,请尝试两次转义黑名单,如下所示

 String dateString = "\\\\" + "/Date(" + System.currentTimeMillis() + ")\\\\" + "/"; 

在第一次传递中,dateString将使其成为\\/Date(1382459367723)\\/ ,最后JSONObject将在内部向其缓冲区添加额外的反斜杠,即\\\/Date(1382459367723)\\\/以便之前的黑色斜杠/将根据JSON解析规则被忽略,您将获得所需的结果,即\/Date(1382459367723)\/