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

如何反序列化含动态子结构的JSON?类结构设计方案

处理含固定+动态结构的JSON反序列化方案

针对你提供的JSON结构(固定字段+动态键值对结构),可以通过固定实体类映射静态字段+键值对集合接收动态字段的方式来设计类结构,以下是主流语言的实现方案:


Java 实现(基于Jackson库)

1. 定义固定结构的子实体类

先把JSON中结构固定的fixStructure1和fixStructure2映射为独立类:

// FixStructure1.java
public class FixStructure1 {
    private String field1;
    private String field2;
    private String field3;

    // 自动生成getter/setter,或用Lombok的@Data注解简化
    public String getField1() { return field1; }
    public void setField1(String field1) { this.field1 = field1; }
    public String getField2() { return field2; }
    public void setField2(String field2) { this.field2 = field2; }
    public String getField3() { return field3; }
    public void setField3(String field3) { this.field3 = field3; }
}

// FixStructure2.java
public class FixStructure2 {
    private String field4;
    private String field5;

    public String getField4() { return field4; }
    public void setField4(String field4) { this.field4 = field4; }
    public String getField5() { return field5; }
    public void setField5(String field5) { this.field5 = field5; }
}

2. 定义主实体类(包含动态结构)

用Map<String, String>接收dynamicStructure中的动态键值对:

// MainData.java
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;

public class MainData {
    private String prop1;
    private int prop2;
    @JsonProperty("fixStructure1")
    private FixStructure1 fixStructure1;
    @JsonProperty("fixStructure2")
    private FixStructure2 fixStructure2;
    @JsonProperty("dynamicStructure")
    private Map<String, String> dynamicStructure;

    // 自动生成所有属性的getter/setter
    public String getProp1() { return prop1; }
    public void setProp1(String prop1) { this.prop1 = prop1; }
    public int getProp2() { return prop2; }
    public void setProp2(int prop2) { this.prop2 = prop2; }
    public FixStructure1 getFixStructure1() { return fixStructure1; }
    public void setFixStructure1(FixStructure1 fixStructure1) { this.fixStructure1 = fixStructure1; }
    public FixStructure2 getFixStructure2() { return fixStructure2; }
    public void setFixStructure2(FixStructure2 fixStructure2) { this.fixStructure2 = fixStructure2; }
    public Map<String, String> getDynamicStructure() { return dynamicStructure; }
    public void setDynamicStructure(Map<String, String> dynamicStructure) { this.dynamicStructure = dynamicStructure; }
}

3. 反序列化代码示例

使用Jackson的ObjectMapper完成JSON到对象的转换:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class JsonParser {
    public static void main(String[] args) throws IOException {
        // 替换为你需要解析的示例JSON字符串
        String json = "{\"prop1\":\"val1\",\"prop2\":5,\"fixStructure1\":{\"field1\":\"value1\",\"field2\":\"value2\",\"field3\":\"value3\"},\"fixStructure2\":{\"field4\":\"value4\",\"field5\":\"value5\"},\"dynamicStructure\":{\"dynamicField1\":\"value6\",\"dynamicField2\":\"value7\"}}";
        
        ObjectMapper mapper = new ObjectMapper();
        MainData data = mapper.readValue(json, MainData.class);
        
        // 验证结果
        System.out.println("prop1: " + data.getProp1());
        System.out.println("dynamicField2: " + data.getDynamicStructure().get("dynamicField2"));
    }
}

C# 实现(基于Newtonsoft.Json库)

1. 定义固定结构的子实体类

public class FixStructure1
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

public class FixStructure2
{
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

2. 定义主实体类(包含动态结构)

用Dictionary<string, string>接收动态字段:

public class MainData
{
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
    public FixStructure1 FixStructure1 { get; set; }
    public FixStructure2 FixStructure2 { get; set; }
    public Dictionary<string, string> DynamicStructure { get; set; }
}

3. 反序列化代码示例

使用JsonConvert完成转换:

using Newtonsoft.Json;
using System;

class Program
{
    static void Main()
    {
        // 替换为目标JSON字符串
        string json = "{\"prop1\":\"val2\",\"prop2\":10,\"fixStructure1\":{\"field1\":\"value1\",\"field2\":\"value2\",\"field3\":\"value3\"},\"fixStructure2\":{\"field4\":\"value4\",\"field5\":\"value5\"},\"dynamicStructure\":{\"dynamicField1\":\"value8\",\"dynamicField3\":\"value9\"}}";
        
        MainData data = JsonConvert.DeserializeObject<MainData>(json);
        
        // 验证结果
        Console.WriteLine($"prop1: {data.Prop1}");
        if (data.DynamicStructure.ContainsKey("DynamicField3"))
        {
            Console.WriteLine($"DynamicField3: {data.DynamicStructure["DynamicField3"]}");
        }
    }
}

核心思路说明

  1. 固定结构:直接通过实体类字段与JSON字段一一映射,保证静态数据的强类型解析;
  2. 动态结构:利用键值对集合(Map/Dictionary)接收不确定的字段,既兼容所有动态字段的变化,又能统一处理值类型(示例中值均为字符串,若值类型不固定可改用Map<String, Object>或Dictionary<string, object>)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:52:41