Java 如何从动态更新的json中获取最新数据?

Java 如何从动态更新的json中获取最新数据?,java,json,Java,Json,有一个聊天,我想解析其中的内容。我得到了url来获取它的.json。所以它看起来像: {"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

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

{"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"}
]}
{"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"}
]}
但是这个json有一些限制,我认为大约有20-30条记录。新记录在开始处添加。它看起来像:

{"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"}
]}
{"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中解析新记录,有什么最佳实践吗?事实上,我不知道如何控制它是否被更新,但我认为每秒读取一次并将结果输出将导致数据重复。

您需要以某种方式对该数据进行切片。。。为了在文件增长时不使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 );

每个消息都有uniq“date”,所以您只需创建
映射
,用所有不存在的元素更新它。或者,如果您不需要时间排序,您可以使用带有日期字符串的
Map

您是否可以控制这些数据?@davidbuzatto,不,我没有。我有一个chat.json文件的链接,该文件在数据库中的数据更新后填充。所以我可以得到这个文件并进行反序列化。@AaronKurtzhals,目前我有用于解析.json文件的JavaBean。我正在考虑反转数据数组,并通过消息id+消息日期进行比较。并以这种方式打印新消息。但是我不知道这样做是否是一个好的实践。你所描述的对我来说听起来很合理。这是我第一次在Java中使用JSON。感谢您的示例,我将尝试并反馈:)