JSONObject包含转义字符

时间:2013-10-26 16:44:07

标签: java jsonobject

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

JSON应如下所示:

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

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

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

我是用Java创建的,所以我可以在我的树莓派上运行它。

这是代码:

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

2 个答案:

答案 0 :(得分:2)

JSONObject正确编码字符串。 This page描述了如何在JavaScript(以及扩展名为JSON)中转义字符串文字。以下注释对于了解示例中的内容非常重要:

  

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

您的示例("\/Date(1382459367723)\/")在/之前使用前面的反斜杠。由于/不在表2.1中,因此应该忽略\。如果您的服务没有忽略\,那么它有一个错误,或者不是JSON解析器(可能它使用的数据格式与JSON类似,但不完全相同)。

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

答案 1 :(得分:1)

@pburka是正确的。如果您想以enum格式发送,请尝试两次转出黑名单

AspxListBox

在第一遍中,dateString将使其成为\/Date(1382459367723)\/,最后JSONObject将在其缓冲区内部添加额外的反斜杠,即String dateString = "\\\\" + "/Date(" + System.currentTimeMillis() + ")\\\\" + "/"; ,以便根据JSON解析规则忽略之前的黑色斜杠和你会得到所需的结果,即\\/Date(1382459367723)\\/