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

Java中如何将JSON对象转为Person对象?转换报错排查

JSON转Person对象报错:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at path $

问题场景

将JSON转换为Person对象时抛出上述错误,相关代码与数据如下:

示例JSON

{
  "type":"set",
  "key":"person",
  "value":{
    "name":"Elon Musk",
    "car":{
      "model":"Tesla Roadster",
      "year":"2018"
    },
    "rocket":{
      "name":"Falcon 9",
      "launches":"87"
    }
  }
}

原转换代码

JsonObject jsonObject = new JsonParser().parse(input.readUTF()).getAsJsonObject();

Gson gson = new Gson();

for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
Person person = gson.fromJson(entry.getValue(), Person.class);
System.out.println(jsonFile);
}

实体类

Person类

@Getter
@Setter
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person  {
String type;
String key;
Value value;
}

Value类

@Data
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
public class Value  {
String name;
Map<String, String> car;
Map<String, String> rocket;
}

错误原因

原代码错误遍历了JSON对象的顶级键值对,将每个键对应的单独值(比如"type"对应的字符串"set")传入gson.fromJson()尝试转换为Person对象。但Person类对应整个JSON结构,GSON期望接收对象类型(BEGIN_OBJECT),实际却拿到字符串类型的值,因此抛出异常。

修正方案

直接将解析后的整个JSON对象传入GSON进行转换,无需遍历键值对:

JsonObject jsonObject = new JsonParser().parse(input.readUTF()).getAsJsonObject();

Gson gson = new Gson();
// 直接用整个jsonObject转换为Person对象
Person person = gson.fromJson(jsonObject, Person.class);
System.out.println(person);

验证说明

Person类的字段type、key、value与JSON顶级键完全匹配,Value类的结构也和JSON中value节点的结构一致,修正后的代码可以正确完成JSON到Person对象的映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:55:18