You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:07