Java Gson:解析非标准JSON格式

Java Gson:解析非标准JSON格式,java,json,gson,Java,Json,Gson,Gson是否有办法读取非标准JSON文件 而不是像以下这样的典型文件: [{obj1},{objN}] 我有这样一个文件: {obj1} {objN} 没有方括号或逗号,每个对象由换行符分隔。我们可以有一个程序引入逗号(,)并构造格式良好的JSON是的,它有。Gson支持宽松的阅读。例如,以下JSON文档(non-standard.JSON): 您可以使用以下阅读方式: private static final Gson Gson=new Gson(); 私有静态最终类型适配器jsonEle

Gson是否有办法读取非标准JSON文件

而不是像以下这样的典型文件:

[{obj1},{objN}]
我有这样一个文件:

{obj1}
{objN}

没有方括号或逗号,每个对象由换行符分隔。

我们可以有一个程序引入逗号(,)并构造格式良好的JSON

是的,它有。Gson支持宽松的阅读。例如,以下JSON文档(
non-standard.JSON
):

您可以使用以下阅读方式:

private static final Gson Gson=new Gson();
私有静态最终类型适配器jsonElementTypeAdapter=gson.getAdapter(JsonElement.class);
公共静态void main(最终字符串…参数)
抛出IOException{
try(final Reader=getPackageResourceReader(Q43528208.class,“non-standard.json”)){
最终JsonReader JsonReader=新JsonReader(读取器);
jsonReader.setLenient(true);//这使它能够工作
while(jsonReader.peek()!=结束文档){
最终的JsonElement=jsonElementTypeAdapter.read(jsonReader);
System.out.println(jsonElement);
}
}
}
输出:

{"foo":1}  
{"bar":1}  
我不确定你是否可以用这种方式编写一个健壮的反序列化程序

更新 为了简化Gson支持,我们可以实现几种方便的读取方法:

//以下实现的快捷方式:将整个结果聚合到单个列表中
私有静态列表parseToListLenient(最终JsonReader JsonReader,最终IMapper listElementAdapter=gson.getAdapter(TypeToken.get(listElementType));
@抑制警告(“未选中”)
final-TypeToken>listAdapter=gson.getAdapter(listTypeToken);
最终类型适配器>(){
@凌驾
公共无效写入(最终JsonWriter out,最终列表值)
抛出IOException{
//总是写一份格式良好的清单
listAdapter.write(out,value);
}
@凌驾
已读取公共列表(中的最终JsonReader)
抛出IOException{
//将作业委托给reading方法-我们只需告诉如何获取列表值
返回ParseToListLenent(在中,listElementAdapter::read);
}
};
@抑制警告(“未选中”)
最终类型适配器castTypeAdapter=(TypeAdapter)TypeAdapter;
返回类型适配器;
}
//一种求解实际类型参数的简单方法
私有类型getTypeParameter0(最终类型){
if(!(参数化类型的类型instanceof)){
//名单
返回Object.class;
}
返回((ParameteredType)类型).getActualTypeArguments()[0];
}
})
.create();
//此类型声明反序列化期间要使用的标记专门化
最终类型=新类型令牌(){
}.getType();
try(final-JsonReader-JsonReader=getPackageResourceJsonReader(Q43528208.class,“non-standard.json”)){
//这就是我们作弊的地方:
//我们告诉Gson反序列化LenientListMarker,但上面的类型适配器将返回一个列表
最终列表映射=gson.fromJson(jsonReader,类型);
系统输出打印LN(地图);
}
}
现在输出的是
Map
s,而不是
JsonElement
s:

[{foo=1},{bar=1}]

更新2
TypeToken.getParameterized
解决方法:

@SuppressWarnings(“未选中”)

使用spark 2,我们可以添加多行作为读取选项

spark.df.option("multiline","true").json("data.json")

你能一行一行地读它吗,或者一块一块地读它,然后一行一行地解析它吗?可能是因为它是一个普通的旧文件,但我不知道gson是否有一些标志,它可以自动执行所有操作。你能提供一个关于这些输入文件的长示例吗?例如,一个既有列表又有键值对的函数,来了解您要做什么?谢谢,很高兴知道!是的,我正在寻找一个反序列化程序,因为我正在尝试将json字符串转换为objects@ekjcfn3902039您希望反序列化的值是什么样的<代码>列表
其中每一行表示一个
T
值?(当我说我不确定这种情况下是否有一个健壮的反序列化程序时,我指的是嵌套列表,因为它需要更“智能”的分隔符分析,当然,如果它可以在Gson中工作的话。)是的,每一行表示一个T值的列表谢谢,但是我的TypeToken没有getParameterized()方法。我一直在使用2.2.4,这是新功能吗?我也不确定getPackageResourceJsonReader()方法和Q43528208类文件是什么。
spark.df.option("multiline","true").json("data.json")