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)\/