在一次营销组件化的开发中。依赖方小伙伴强烈要求我们提供工具包用来解析类似黑盒的大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;
}
}