Java如何通过classObj或其他方式生成含重复键的JSON数据
问题前置说明
你给出的JSON结构不符合RFC 8259 JSON官方标准规范,同一JSON对象中不允许出现重复的键名,绝大多数JSON解析工具解析该结构时只会保留最后一个
student键对应的值,之前的内容会被直接覆盖。除非你对接的下游系统强依赖这种非标准结构,否则强烈建议调整为符合规范的结构,避免后续出现解析异常。
方案1:使用符合规范的结构实现(推荐)
你给出的重复键结构的业务语义等价于student数组包含两个学生对象,该结构符合JSON规范,所有序列化/解析工具都可正常支持,实现步骤如下:
1. 定义Student实体类
import com.fasterxml.jackson.annotation.JsonProperty; // 引入Jackson注解,也可替换为Gson对应的@SerializedName注解 public class Student { private String name; private String id; // 映射JSON中的@class字段,避免和Java关键字class冲突 @JsonProperty("@class") private String clazz; // 按需添加构造方法、getter、setter、toString方法 public Student(String name, String id, String clazz) { this.name = name; this.id = id; this.clazz = clazz; } // getter、setter省略 }
2. 定义外层包装类
import java.util.List; public class StudentResp { private List<Student> student; public StudentResp(List<Student> student) { this.student = student; } // getter、setter省略 }
3. 序列化生成JSON
以Jackson序列化框架为例:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Arrays; public class GenerateJson { public static void main(String[] args) throws Exception { // 构造学生对象 Student s1 = new Student("TEST", "1234", "10"); Student s2 = new Student("TEST12", "1235", "12"); StudentResp resp = new StudentResp(Arrays.asList(s1, s2)); ObjectMapper objectMapper = new ObjectMapper(); // 格式化输出JSON String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(resp); System.out.println(json); } }
输出的标准JSON结构如下,业务语义和你给出的结构完全一致:
{ "student": [ { "name": "TEST", "id": "1234", "@class": "10" }, { "name": "TEST12", "id": "1235", "@class": "12" } ] }
方案2:强制生成非标准重复键结构(不推荐)
如果必须完全符合你给出的重复键结构,可以通过字符串拼接的方式实现,示例如下:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class GenerateNonStandardJson { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // 序列化第一个student片段 Student s1 = new Student("TEST", "1234", "10"); String part1 = mapper.writeValueAsString(new StudentResp(List.of(s1))); // 去掉外层大括号 part1 = part1.substring(1, part1.length() - 1).trim(); // 序列化第二个student片段 Student s2 = new Student("TEST12", "1235", "12"); String part2 = mapper.writeValueAsString(new StudentResp(List.of(s2))); part2 = part2.substring(1, part2.length() - 1).trim(); // 拼接成最终的非标准JSON String finalJson = "{\n " + part1 + ",\n " + part2 + "\n}"; System.out.println(finalJson); } }
运行后输出的结果和你给出的重复键JSON完全一致。
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

