添加JSON数组以返回服务器端事件

And*_*897 2 javascript json server-sent-events

目前我正在以JSON格式编写数据,一次一条消息如下:

String[] arr = strLine.split(",");

   out.append("data: {\n");
   out.append("data: \"c1\": " + arr[0].toString()+ ",\n");
   out.append("data: \"c2\": " + arr[1].toString()+ ",\n" );
   out.append("data: }\n\n");
   out.flush();
Run Code Online (Sandbox Code Playgroud)

但是,现在我想out.flush只有当有5条这样的消息时.那么,我该怎么做?创建Json消息?使用单独的数据:{}正文.如果我这样做,如何使用javascript访问客户端的c1,c2对?还有什么选择.

PS:当我说5个值时,我的意思是5对c1和c2的值.

如果我做这样的事情,如何在客户端使用javascript访问值

out.append("data: [\n");
for(int j=0; j<5; j++) {
     String[] arr = strLine.split(",");
     if (j!=0) out.append(",\n");
     out.append("\{"c1\": " + arr[0].toString()+ ",\n");
     out.append(\"c2\": " + arr[1].toString()+"}" );
     out.flush();
  }
//HEY MR, LOOK BELOW ME
//HEY MR, LOOK BELOW ME
//HEY MR, LOOK BELOW ME
//HEY MR, LOOK BELOW ME
out.append("]\n"); <---- HEY RIGHT HERE 
//HEY MR, LOOK ABOVE ME
//HEY MR, LOOK ABOVE ME
//HEY MR, LOOK ABOVE ME
//HEY MR, LOOK ABOVE ME
out.flush();
Run Code Online (Sandbox Code Playgroud)

按要求工作JS代码(在body load上调用registerSSE()):

function registerSSE(){
  var source = new EventSource ('http://localhost:8080/SSE_Test1/ReadCsv');
  source.addEventListener('message', function(e) {
  var data = JSON.parse(e.data);
  console.log(data.timestamp, data.c1, data.c2, data.c3, data.c4);
}
Run Code Online (Sandbox Code Playgroud)

在servlet中你只需要附加这一行:

response.setContentType("text/event-stream");
Run Code Online (Sandbox Code Playgroud)

sam*_*aml 8

请不要手动生成/解析JSON字符串.在Java中,使用org.json并在Javascript中使用JSON.parseJSON.stringify.

MDN:解析字符串化

要输出5对,你可以这样做:

String[] arr = strLine.split(",");
JSONArray array = new JSONArray();
for(int i=0, j=0;i<arr.length;i+=2,j++){
   JSONObject dataObj = new JSONObject();
   dataObj.put("c1", arr[i]);
   dataObj.put("c2", arr[i+1]);
   array.put(j, dataObj);
   if ((j > 0) && (j % 5 ==0)) {
       out.append("data: " +array.toString() + "\n");
       out.flush();
       array = new JSONArray(); // start with a new one
   }
}
Run Code Online (Sandbox Code Playgroud)

要在客户端访问它,请给出您的EventSource source:

source.addEventListener('message', function(e) {
    var data = JSON.parse(e.data); // data is an array of {c1:...,c2:...} objects
    for (var i = 0; i < data.length; i++) { // it should be 5 in length
        console.log('c1 is: '+data[i].c1+' and c2 is '+data[i].c2);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我告诉他在客户端使用`JSON.parse`.那怎么回答这个问题呢? (3认同)
  • 你甚至没有提到要求的主题,你只是找到获得代表的最快方式.是的,他应该使用JSON.他现在如何将这5个一次送到客户端?他是如何使用您建议的库在Java中正确生成的?他如何正确地从Java返回_only_ JSON?他如何处理那些小数据:[他想把它放在一开始? (2认同)