自定义json转换,把model的attrs和get方法都加入json

大神们看看有什么不合理的没

public class ToJson implements JFinalJsonKit.ToJson<BaseModel> {
    private static final Object[] NULL_ARGS = new Object[0];
    @Override
    public void toJson(BaseModel value, int depth, JFinalJsonKit.JsonResult ret) {
        if (JFinalJsonKit.checkDepth(depth--, ret)) {
            return ;
        }

        Map<String, Object> attrs = CPI.getAttrs(value);
        Method[] methods = value.getClass().getDeclaredMethods();
        for (Method m : methods) {
            if (m.getParameterCount() != 0 || m.getReturnType() == void.class) {
                continue ;
            }

            String methodName = m.getName();
            int indexOfGet = methodName.indexOf("get");
            if (indexOfGet == 0 && methodName.length() > 3) {  // Only getter
                String attrName = methodName.substring(3);
                if (!attrName.equals("Class")) {            // Ignore Object.getClass()
                    try {
                        attrName = StrKit.firstCharToLowerCase(attrName);
                        Object attrValue = m.invoke(value, NULL_ARGS);
                        attrs.put(attrName,attrValue);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            }
            else {
                int indexOfIs = methodName.indexOf("is");
                if (indexOfIs == 0 && methodName.length() > 2) {
                    String attrName = methodName.substring(2);
                    try {
                        attrName = StrKit.firstCharToLowerCase(attrName);
                        Object attrValue = m.invoke(value, NULL_ARGS);
                        attrs.put(attrName,attrValue);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
        JFinalJsonKit.modelAndRecordToJson(attrs, depth, ret);
    }
}



评论区

JFinal

2020-06-03 11:37

attrs 中的属性有可能与 getter 方法要表达的重合,例如你用 jfinal 的生成器为 model 生成了 base model, 这些 base model 中所有的 getter 方法都与 attrs 方法中的字段重合

当然,你的 ToJson 扩展在纯用法上是对的

macaque

2020-06-03 11:44

@JFinal value.getClass().getDeclaredMethods(); 这个是不会取到父类方法的吧

macaque

2020-06-03 11:49

@JFinal 比如Account extend BaseAccount extend BaseMode extend Model 这么个关系, 只把Account 中的get方法和attrs合到一起

JFinal

2020-06-03 12:55

@macaque 看漏了,value.getClass().getDeclaredMethods() 这个可以的,赞