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

如何从多键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:50