Java场景下JSON对象对应实体类字段重置方案推荐
JSON实体字段重置技术方案选型
场景说明
需要对JSON解析后的实体类中指定Product字段做重置,处理后再序列化回JSON字符串,现有结构如下:
1.1 原始JSON结构示例
{ "productCard" : { "productA" : { "state" : "Y", "desc" : "AAA", "someProp" : 112 }, "productB" : { "state" : "X", "desc" : " BBB ", "listSomeThing" : [ { "p1" : 1, "p2" : "2" }, { "p2" : "3" } ] } // 后续可新增更多产品 // 也可存在其他对象类型 } // 最外层可存在其他和产品卡片无关的对象字段 }
1.2 对应实体类结构
class Product { protected String state; protected String desc; } class SomeThing { private int p1; private String p2; } class ProductA extends Product { private int someProp; } class ProductB extends Product { private List<SomeThing> listSomeThing; } class ProductCard { private ProductA productA; private ProductB productB; } class BaseObject { private ProductCard productCard; }
现有方案对比
方案1:实体类继承重写reset方法
实现逻辑:在Product父类定义公共重置逻辑,子类重写处理自有字段,上层容器逐层封装重置调用
// 父类公共重置逻辑 class Product { void reset(){ this.state = "X"; this.desc = ""; } } // 子类重写处理自有字段 class ProductB extends Product { @Override void reset(){ super.reset(); this.listSomeThing = new ArrayList<>(); } } // 上层容器逐层封装调用 class ProductCard { private ProductA productA; private ProductB productB; void resetAllProduct(){ this.productA.reset(); this.productB.reset(); } } class BaseObject { private ProductCard productCard; void resetAllProductCard(){ this.productCard.resetAllProduct(); } }
- 优点:符合开闭原则,公共重置逻辑统一维护,新增Product子类时只需要子类自己实现reset方法,上层调用逻辑只需新增一行对应产品的reset调用,不易漏改,代码复用性高
- 缺点:需要修改原有实体类代码,若实体类是自动生成、或属于不可修改的二方包依赖则无法使用
方案2:独立工具类实现重置逻辑
实现逻辑:在业务类/工具类中单独写reset方法,直接操作所有Product字段赋值
void reset(ProductCard productCard){ ProductA productA = productCard.getProductA(); productA.setState("X"); productA.setDesc(""); ProductB productB = productCard.getProductB(); productB.setState("X"); productB.setDesc(""); productB.setListSomeThing(new ArrayList<>()); }
- 优点:无需修改原有实体类结构,适合实体类不可修改的场景
- 缺点:公共逻辑重复编写,新增Product子类时需要同时修改ProductCard字段和工具类的reset方法,容易漏改,后续重置规则调整时需要修改多处代码,维护成本高
选型建议
- 如果实体类可自主维护、允许新增方法,优先选择方案1,扩展性和可维护性更好,符合面向对象设计规范
- 如果实体类是自动生成的代码、或者属于不能修改的外部依赖,可选择方案2
其他可选方案
如果产品类型扩展非常频繁,不想和实体类强绑定,可以直接操作JSON树节点完成重置,无需解析成实体类,示例(基于Jackson):
ObjectMapper objectMapper = new ObjectMapper(); // 直接解析为JSON树 JsonNode rootNode = objectMapper.readTree(originalJsonStr); JsonNode productCardNode = rootNode.get("productCard"); // 遍历productCard下所有产品节点 Iterator<String> productFieldNames = productCardNode.fieldNames(); while (productFieldNames.hasNext()) { String productKey = productFieldNames.next(); ObjectNode productNode = (ObjectNode) productCardNode.get(productKey); // 统一重置公共字段 productNode.put("state", "X"); productNode.put("desc", ""); // 特殊字段处理 if (productNode.has("listSomeThing")) { productNode.putArray("listSomeThing"); } } // 直接输出重置后的JSON字符串 String resetJson = objectMapper.writeValueAsString(rootNode);
- 优点:完全和实体类解耦,新增产品类型无需修改重置逻辑,适合JSON结构灵活多变的场景
- 缺点:如果重置规则非常复杂,JSON节点操作的代码可读性会比实体类操作低
内容的提问来源于stack exchange,提问作者SandBlue
相关产品推荐
相关产品推荐

