我有一个文件作为输入,其中包含一个json:
[ {
...,
...
},
{
...,
...
},
{
...,
...
}
]我想阅读它而不破坏弹簧批次原理(与FlatFileReader或XmlReader一样)
我没有找到任何方法去做,读者已经实现了春季批处理。
实现这个阅读器的最佳方法是什么?
提前谢谢
发布于 2014-08-29 22:32:28
假设您想对StaxEventItemReader建模,因为您希望将JSON数组的每一项读入Spring中的一个项,下面是我的建议:
RecordSeparatorPolicy -您将需要实现您自己的RecordSepartorPolicy,它指示您是否已完成完整项目的阅读。您还可以使用RecordSeparatoerPolicy#postProcess来清理您需要处理的开头和结尾的[]以及逗号分隔符。LineTokenizer -然后您将希望创建解析JSON的自己的LineTokenzier。我今天正在为一个项目编写一个代码,这样您就可以使用该代码作为开始(请考虑它未经测试):
公共类JsonLineTokenizer实现LineTokenizer {@覆盖公共FieldSet令牌(字符串行){ List令牌=新ArrayList<>();尝试{ HashMap结果=新ObjectMapper().readValue(行,HashMap.class);tokens.add((字符串) result.get("field1"));tokens.add((字符串)result.get(“field2”));} catch (IOException e) {抛出新RuntimeException(“无法解析json:”+RuntimeException);}返回新DefaultFieldSet(tokens.toArray(新字符串)、{"field1“、"field2"});}发布于 2015-06-09 09:23:15
这是我从建议和默认实现开始编写的记录分隔策略。我对读取记录使用了一个内部的纯字符串表示,但是我发现使用codehaus对象解析JSON非常简单。
public class JsonRecordSeparatorPolicy extends SimpleRecordSeparatorPolicy {
/**
* True if the line can be parsed to a JSON object.
*
* @see RecordSeparatorPolicy#isEndOfRecord(String)
*/
@Override
public boolean isEndOfRecord(String line) {
return StringUtils.countOccurrencesOf(line, "{") == StringUtils.countOccurrencesOf(line, "}")
&& (line.trim().endsWith("}") || line.trim().endsWith(",") || line.trim().endsWith("]") );
}
@Override
public String postProcess(String record) {
if(record.startsWith("[")) record = record.substring(1);
if(record.endsWith("]")) record = record.substring(0, record.length()-1);
if(record.endsWith(",")) record = record.substring(0, record.length()-1);
return super.postProcess(record);
}}
https://stackoverflow.com/questions/25576974
复制相似问题