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
相关产品推荐
相关产品推荐

