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

如何使用Gson的fromJson方法将指定JSON转换为Java对象?

JSON转Java对象属性为null的解决方法

问题描述

我有一段特定格式的JSON数据,想用Gson库的fromJson方法转成Java对象,但自己写了对应的Java类(jsonDesc.java和Desc.java)后,转换得到的对象属性值都是null,该怎么解决?

目标JSON格式

{
   "desc":[
      {
         "name":"id",
         "desc":{
            "ip_arduino":"value",
            "id_house":"value",
            "house_address":"value"
         }
      },
      {
         "name":"P1",
         "desc":{
            "field":"panel1",
            "value":0
         }
      },
      {
         "name":"P2",
         "desc":{
            "field":"panel3",
            "value":0
         }
      },
      {
         "name":"P3",
         "desc":{
            "field":"panel3",
            "value":0
         }
      },
      {
         "name":"P4",
         "desc":{
            "field":"panel4",
            "value":0
         }
      }
   ]
}

我编写的Java类

jsonDesc.java

public class jsonDesc {

    private ArrayList<Desc> desc = new ArrayList();
    
}

Desc.java

public class Desc {
    String name;
    desc desc;

    desc1 desc1;

    public class desc{
       String ip_arduino;
       String id_house;
       String house_address;
    }

    public class desc1{
        String name;
        desc desc;
        public class desc{
            String field;
            String value;
        }
    }

}

问题原因及修复方案

你的Java类结构完全不符合JSON的层级映射规则,核心问题包括:

  • 属性与内部类同名,导致Gson无法识别映射关系
  • 非静态内部类需要外部类实例,Gson无法直接实例化
  • 类结构拆分错误,JSON中所有desc字段属于同一层级的变体,无需拆成两个内部类
  • 包访问权限的属性,Gson在部分场景下无法赋值

修复后的Java类(推荐方案)

JsonDesc.java(遵循Java大驼峰命名规范)

import java.util.List;

public class JsonDesc {
    private List<DescItem> desc;

    // Gson必须的无参构造器
    public JsonDesc() {}

    // 可选:添加getter/setter方便后续操作
    public List<DescItem> getDesc() {
        return desc;
    }

    public void setDesc(List<DescItem> desc) {
        this.desc = desc;
    }
}

DescItem.java

public class DescItem {
    private String name;
    private DescContent desc;

    public DescItem() {}

    // 可选:添加getter/setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DescContent getDesc() {
        return desc;
    }

    public void setDesc(DescContent desc) {
        this.desc = desc;
    }

    // 静态内部类,包含所有可能的desc字段,不存在的字段会自动设为null
    public static class DescContent {
        private String ip_arduino;
        private String id_house;
        private String house_address;
        private String field;
        private Integer value;

        public DescContent() {}

        // 按需添加getter/setter
        public String getIp_arduino() {
            return ip_arduino;
        }

        public void setIp_arduino(String ip_arduino) {
            this.ip_arduino = ip_arduino;
        }

        public String getId_house() {
            return id_house;
        }

        public void setId_house(String id_house) {
            this.id_house = id_house;
        }

        public String getHouse_address() {
            return house_address;
        }

        public void setHouse_address(String house_address) {
            this.house_address = house_address;
        }

        public String getField() {
            return field;
        }

        public void setField(String field) {
            this.field = field;
        }

        public Integer getValue() {
            return value;
        }

        public void setValue(Integer value) {
            this.value = value;
        }
    }
}

转换测试代码

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        String jsonStr = "你的JSON字符串内容";
        Gson gson = new Gson();
        JsonDesc result = gson.fromJson(jsonStr, JsonDesc.class);
        
        // 验证转换结果
        for (DescItem item : result.getDesc()) {
            System.out.println("名称:" + item.getName());
            if (item.getDesc().getIp_arduino() != null) {
                System.out.println("ArduinoIP:" + item.getDesc().getIp_arduino());
            } else {
                System.out.println("面板:" + item.getDesc().getField() + ",值:" + item.getDesc().getValue());
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者DiegoM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:54:56