如何从多键JSON对象解析winame与val值到Java对象
解析嵌套JSON字符串为Java对象的方案
没问题,我来帮你搞定这个解析问题。首先咱们得明确你的需求:外层JSON里winame是普通字符串,而val是一个JSON数组的字符串形式(不是直接的JSON数组),要把它们一起解析成对应的Java对象。下面用常用的Jackson库来实现,步骤清晰易懂:
1. 定义对应的Java实体类
首先得创建两个实体类:一个对应外层的整体结构,另一个对应val里的担保对象结构。
担保对象实体类(Gurantor)
这个类要和val数组里的字段一一对应:
public class Gurantor { private String gurName; private String gurType; private String crNo; private String crissueDate; private String dob; private String gender; private String address; private String maritialStatus; private String cache; // 必须添加无参构造函数(Jackson反序列化需要) public Gurantor() {} // 生成所有字段的Getter和Setter方法 // 这里省略具体代码,你可以用IDE自动生成 }
外层整体实体类(WinEntity)
这个类包含winame和存储担保对象的列表:
public class WinEntity { private String winame; private List<Gurantor> val; // 注意这里的类型是List<Gurantor>,不是字符串 // 无参构造函数 public WinEntity() {} // Getter和Setter方法 // 同样省略具体生成代码 }
2. 选择解析方案
针对val是JSON字符串的情况,有两种常用方案:
方案一:分步解析(简单直观)
先解析外层JSON拿到winame和val的字符串内容,再单独把val的字符串解析成List<Gurantor>:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class ParserDemo { public static void main(String[] args) throws Exception { // 你的原始JSON字符串(注意转义双引号) String rawJson = "{ \"winame\": \"123\", \"val\": \"[ { \\\"gurName\\\": \\\"sds\\\", \\\"gurType\\\": \\\"\\\", \\\"crNo\\\": \\\"\\\", \\\"crissueDate\\\": \\\"\\\", \\\"dob\\\": \\\"\\\", \\\"gender\\\": \\\"\\\", \\\"address\\\": \\\"\\\", \\\"maritialStatus\\\": \\\"\\\", \\\"cache\\\": \\\"\\\" } ]\" }"; ObjectMapper objectMapper = new ObjectMapper(); // 第一步:解析外层JSON,获取winame和val的字符串 java.util.Map<String, String> outerMap = objectMapper.readValue(rawJson, new TypeReference<java.util.Map<String, String>>() {}); String winameValue = outerMap.get("winame"); String valJsonStr = outerMap.get("val"); // 第二步:将val的字符串解析为Gurantor列表 List<Gurantor> gurantors = objectMapper.readValue(valJsonStr, new TypeReference<List<Gurantor>>() {}); // 第三步:组装成WinEntity对象 WinEntity result = new WinEntity(); result.setWiname(winameValue); result.setVal(gurantors); // 测试输出 System.out.println("Winame: " + result.getWiname()); System.out.println("First Gurantor Name: " + result.getVal().get(0).getGurName()); } }
方案二:自定义反序列化器(一步到位)
如果想更优雅地一步解析完成,可以给WinEntity的val字段添加自定义反序列化逻辑:
第一步:编写自定义反序列化器
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.type.CollectionType; import java.io.IOException; import java.util.List; public class GurantorListDeserializer extends JsonDeserializer<List<Gurantor>> { @Override public List<Gurantor> deserialize(JsonParser parser, DeserializationContext context) throws IOException { // 读取val字段的字符串值 String valStr = parser.getText(); // 用当前的ObjectMapper解析字符串为Gurantor列表 ObjectMapper mapper = (ObjectMapper) parser.getCodec(); CollectionType listType = mapper.getTypeFactory().constructCollectionType(List.class, Gurantor.class); return mapper.readValue(valStr, listType); } }
第二步:给WinEntity的val字段添加注解
修改WinEntity类,指定自定义反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.List; public class WinEntity { private String winame; @JsonDeserialize(using = GurantorListDeserializer.class) private List<Gurantor> val; // 无参构造函数、Getter和Setter方法 }
第三步:一步解析JSON
import com.fasterxml.jackson.databind.ObjectMapper; public class ParserDemo { public static void main(String[] args) throws Exception { String rawJson = "{ \"winame\": \"123\", \"val\": \"[ { \\\"gurName\\\": \\\"sds\\\", \\\"gurType\\\": \\\"\\\", \\\"crNo\\\": \\\"\\\", \\\"crissueDate\\\": \\\"\\\", \\\"dob\\\": \\\"\\\", \\\"gender\\\": \\\"\\\", \\\"address\\\": \\\"\\\", \\\"maritialStatus\\\": \\\"\\\", \\\"cache\\\": \\\"\\\" } ]\" }"; ObjectMapper objectMapper = new ObjectMapper(); WinEntity result = objectMapper.readValue(rawJson, WinEntity.class); // 直接使用解析后的对象 System.out.println("Winame: " + result.getWiname()); System.out.println("First Gurantor Name: " + result.getVal().get(0).getGurName()); } }
3. 依赖准备
确保你的项目中添加了Jackson的核心依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版本即可 --> </dependency>
内容的提问来源于stack exchange,提问作者Nishant Varshney
相关产品推荐
相关产品推荐

