0

有一个聊天内容我要解析。我得到了获取它的 .json 的 url。所以它看起来像:

{"messages":[
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:54","chatId":"111"},
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:54","chatId":"111"},
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:54","chatId":"111"}
]}

但是这个 json 有一些限制,我认为大约 20-30 条记录。在开头添加新记录。看起来像:

{"messages":[
{"id":"222222","uid":"33333","name":"User","message":"Message","date":"2013-02-15 18:21:59","chatId":"111"},
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:54","chatId":"111"},
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:55","chatId":"111"}
]}
.......
{"messages":[
{"id":"333333","uid":"44444","name":"User","message":"Message","date":"2013-02-15 19:13:34","chatId":"111"},
{"id":"222222","uid":"33333","name":"User","message":"Message","date":"2013-02-15 18:21:59","chatId":"111"},
{"id":"111111","uid":"22222","name":"User","message":"Message","date":"2013-02-15 17:21:54","chatId":"111"}
]}

我将通过 GSON 或 JSON Java 读取此 json 并将其放置到任何输出中,没关系 :)

但是,关于如何解析动态更新的 json 中的新记录,是否有任何最佳实践?实际上我不知道如何控制它的更新,但是我认为每秒读取一次并将结果输出会导致数据重复。

4

2 回答 2

1

您将需要以某种方式对这些数据进行切片...为了在文件增长时不让 GSON 解析变慢,我认为您需要预处理文件,对一次性数据进行切片。我会做类似的事情:

  • 首次执行:完全解析文件并存储第一个id,因为它是最新的数据;
  • 第二次执行(和其他):读取文件并将其存储在 StringBuilder 中。使用获得的字符串,对一次性数据进行切片,因为您之前存储了 id。此 ID 将显示您需要从哪里开始切片。使用新数据,解析 GSON 并再次存储第一个 id。

您可以使用它创建您的代码来执行切片并适应我在下面所说的想法:

String data = "{\"messages\":[" +
        "{\"id\":\"333333\",\"uid\":\"44444\",\"name\":\"User\",\"message\":\"Message\",\"date\":\"2013-02-15 19:13:34\",\"chatId\":\"111\"}," +
        "{\"id\":\"222222\",\"uid\":\"33333\",\"name\":\"User\",\"message\":\"Message\",\"date\":\"2013-02-15 18:21:59\",\"chatId\":\"111\"}," +
        "{\"id\":\"111111\",\"uid\":\"22222\",\"name\":\"User\",\"message\":\"Message\",\"date\":\"2013-02-15 17:21:54\",\"chatId\":\"111\"}" +
        "]}";

String lastId = "111111";
int sliceUntil = data.indexOf( "{\"id\":\"" + lastId + "\"" );

// since your disposable data is in the "tail" you your file,
// you just need to get the valid data (the data until the "last id") 
// and add the chars "]" and "}" to close your JSON
String newData = data.substring( 0, sliceUntil ) + "]}";

System.out.println( newData );
于 2013-02-15T14:06:21.467 回答
0

每条消息都有唯一的“日期”,因此您可以Map<Date, Message>使用所有不存在的元素创建、更新它。或者,Map<String, Message>如果您不需要时间排序,您可以只使用日期字符串

于 2013-02-15T14:09:08.300 回答