fromJson解析含双引号JSON返回NULL,求判断正确JSON字符串
问题分析与解决方案
首先直接给结论:str1是符合你单个POJO类映射要求的正确JSON格式,而str2之所以会让fromJson返回null,大概率是因为它的结构和你的POJO类不匹配——这也是CSV转JSON时非常常见的问题。
为什么str1能正常工作?
str1是标准的单个JSON对象格式:
{"code":602,"desc":"somedescription"}
它的键名(code、desc)和你的POJO类字段完全对应,Gson可以直接把这个JSON对象映射成你的POJO实例,自然能成功填充数据。
为什么str2会返回null?
CSV本质是多行表格型数据,大多数在线转换器默认会把它转换成JSON数组(比如下面这种格式):
[{"code":602,"desc":"somedescription"}]
而你的代码是用fromJson尝试把数组解析成单个POJO对象,类型完全不匹配,Gson无法完成映射,就会返回null。
另外还有一种可能:str2的键名和POJO的字段名不匹配(比如大小写错误、拼写差异),这也会导致Gson找不到对应的字段,最终返回null。
解决办法
根据你的实际需求,分两种情况处理:
- 如果CSV只有一行数据:重新用在线转换器时,选择生成「单个JSON对象」而不是数组,确保输出格式和str1一致;
- 如果CSV有多行数据:需要把POJO放到集合中解析,示例代码如下:
// 假设你的POJO类名为MyData String str2 = "[{\"code\":602,\"desc\":\"somedescription\"}, {\"code\":603,\"desc\":\"anotherdesc\"}]"; List<MyData> dataList = new Gson().fromJson(str2, new TypeToken<List<MyData>>(){}.getType()); // 遍历集合获取每个POJO实例 for(MyData data : dataList) { System.out.println(data.getCode() + ": " + data.getDesc()); } - 检查POJO类的要求:确保你的POJO类有无参构造函数(Gson必须用到),如果JSON键名和POJO字段名不一致,要使用
@SerializedName注解指定映射关系,比如:public class MyData { @SerializedName("code") private int code; @SerializedName("desc") private String description; // 字段名和JSON键名不同时用注解指定 public MyData() {} // 必须的无参构造 // getter和setter方法 public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
内容的提问来源于stack exchange,提问作者megjosh
相关产品推荐
相关产品推荐

