枚举类型的嵌套使用

在一次营销组件化的开发中。依赖方小伙伴强烈要求我们提供工具包用来解析类似黑盒的大json串串。小伙伴们并不想理解黑盒内容,但是想获取他们需要的叶子节点的数值。

{
    "data": {
        "creator": "{\"id\":\"666666\",\"name\":\"大头\",\"prefix\":\"dt666666\"}",
        "name": "大头大头下雨不愁",
        "dateRange": "{\"start\":\"2020-06-30 00:00:00\",\"end\":\"2020-06-30 23:59:59\"}",
        "activityTemplate": "0",
        "periodAndRule": "[{\"weekday\":\"2\",\"timeRange\":{\"start\":\"00:00:00\",\"end\":\"23:59:59\"},\"rule\":[{\"condition\":1200,\"discount\":100,\"shopSubsidy\":100,\"elemeSubsidy\":0}]}]",
        "userDayOrderLimit": "{\"limit\":\"1\"}",
        "userScope": "0"
    },
    "instanceId": 423014
}

问题来了,怎么方便又快速拿到叶子节点的值呢?在我们营销组件的场景下data下面的值是可以枚举的,而且枚举可以表示很多营销模型的意义。那么将这种json的转化为有父枚举类型嵌套结构,能准确表达出json的对象关系。

public enum  MktField{

    NAME("name",null,"活动名称"),

    /**
     * 创建者对象
     */
    CREATOR("creator", null,"创建者"),
    CREATOR_ID("id", CREATOR,"创建者ID"),
    CREATOR_NAME("name", CREATOR, "创建者name"),
    CREATOR_PREFIX("prefix", CREATOR, "前缀"),
    CREATOR_TYPE("creatorType", null,"创建者类型"),
    
    ......


    public String key;
    public MktField parent;
    public String title;

    MktField(String key, MktField parent, String title) {
        this.key = key;
        this.parent = parent;
        this.title = title;
    }
    
    ......
}

剩下的就写一个小工具来方便提取具体含义的值就好了。这种结构对递归太友好,所以我直接用了递归。这样根据枚举值以及大json对象,就能方便的黑盒方式获取叶子的值了。

private static Object getMktFieldValue(MktField field, JSONObject fieldMetaJson){
        try {
            JSONObject oj;
            if (field.getParent() == null) {
                return fieldMetaJson.get(field.getKey());
            } else {
                if (getMktFieldValue(field.getParent(), fieldMetaJson) instanceof String){
                    oj = JSON.parseObject((String) getMktFieldValue(field.getParent(), fieldMetaJson));
                } else {
                    oj = (JSONObject) getMktFieldValue(field.getParent(), fieldMetaJson);
                }
            }
            return oj.get(field.getKey());
        }catch (Exception e){
            return null;
        }
    }

你可能感兴趣的:(枚举类型的嵌套使用)