用Gson解析一段json,想把一个属性定义成String,来接收所有的数据类型,拿到解析出来的String再做处理,结果遇到这个异常.
这个异常大家应该都遇到过,就是我们定义的对象的某个属性是string类型的,但json中确是Array类型的.
这是因为:Gson中,关键字后面出现""引起来的内容将会被只认为是STRING,“{}”只被认为是类,“[]”只被认为是List,这个几乎是强制性的。
就是说如果你的实体预计是获取String的变量,但是关键字后面对应的却出现了“{”或“[”,那么这个转换将被认为是错误的,抛出异常。
想到以前用的FastJson好像是不存在这种问题的,于是做了测试.
@Test
public void jsonTest(){
// json文件
File file=new File("C://data.json");
// 文件转String
String data=readToString(file.getAbsolutePath());
// fastjson解析
useFastJson(data);
// Gson解析
useGson(data);
}
/**
* 用fastjson解析
* @param data
*/
private void useFastJson(String data){
Article article= JSON.parseObject(data, Article.class);
System.out.println(article.getDetail());
}
/**
* 用Gosn 解析
* @param data
*/
private void useGson(String data){
Article article= new Gson().fromJson(data,Article.class);
System.out.println(article.getDetail());
}
/**
* 文件中获取String
* @param fileName
* @return
*/
public static String readToString(String fileName) {
String encoding = "UTF-8";
File file = new File(fileName);
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
try {
FileInputStream in = new FileInputStream(file);
in.read(filecontent);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(filecontent, encoding);
} catch (UnsupportedEncodingException e) {
System.err.println("The OS does not support " + encoding);
e.printStackTrace();
return null;
}
}
结果:
[{"catalog":"环境搭建","article":[{"read":1,"column":9,"id":2,"title":"IntelliJIDEA环境搭建","slug":"static/kotlin_article/0_1.html"},{"read":1,"column":9,"id":3,"title":"Eclipse环境搭建","slug":"static/kotlin_article/0_2.html"},{"read":1,"column":9,"id":4,"title":"使用命令行编译","slug":"static/kotlin_article/0_3.html"},{"read":1,"column":9,"id":5,"title":"Android环境搭建","slug":"static/kotlin_article/0_4.html"}]}]
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailcom.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 16 path $.detailat com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)at com.google.gson.Gson.fromJson(Gson.java:888)at com.google.gson.Gson.fromJson(Gson.java:853)at com.google.gson.Gson.fromJson(Gson.java:802)at com.google.gson.Gson.fromJson(Gson.java:774)at per.wsj.myapplication.ExampleUnitTest.useGson(ExampleUnitTest.java:60)at per.wsj.myapplication.ExampleUnitTest.jsonTest(ExampleUnitTest.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)
果然Fastjson是可以的,好坑啊