1

実行中のサービスに 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 文字列にこれらのエスケープ文字がまだ含まれていることです。しかし、最初に文字列を印刷すると、エスケープ文字が含まれていません。これらを取り除く方法はありますか?私のサービスはこれらを解析できません..

これは、クロムの残りのクライアントで送信するもののサンプルです。

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

2 に答える 2

2

JSONObject文字列を正しくエンコードしています。このページでは、文字列リテラルを JavaScript (および拡張により JSON) でエスケープする方法について説明します。次の注意は、例で何が起こるかを理解するために重要です。

表 2.1 にリストされていない文字については、前のバックスラッシュは無視されますが、この使用法は非推奨であり、避ける必要があります。

あなたの例 ( "\/Date(1382459367723)\/") は、前にバックスラッシュを使用してい/ます。/は表 2.1 にないため、\単に無視する必要があります。サービスが を無視しない場合\は、バグがあるか、JSON パーサーではありません (おそらく、JSON に似ているが完全ではないデータ形式を使用している可能性があります)。

非準拠の JSON を生成する必要があるため、標準ツールを使用して生成することはできません。2 つのオプションは、独自の非完全な JSON エンコーダーを作成するか、エスケープする必要がある文字 ( や など) を回避すること\です"

于 2013-10-26T19:16:12.243 に答える