flexjson的使用技巧和扩展

 

    个人真心喜欢flexjson,虽然在效率上比较不上一些以效率鼓吹的json序列化工具,但是它在json序列化的灵活上,整个软件的结构上和扩展的方便性上是无与伦比的。

 

flexjson的使用技巧:

    flexjson在反序列化json时

如果是ArrayList<Bean>

new JSONSerialize.use("values",Bean.class).deserialize(list);

 

如果只需要一个bean的个别属性,而不需要其它属性,不用一个个的去排除

可以使用

new JSONSerializer().include("propA").exclude("*")

new JSONSerializer().include("a.b").exclude("a.*")

 

 

另外有时候序列化的时候需要特殊需求,由其是在hibernate做对象关联的时候,flexjson在序列化时,1对多已经完善的解决了,但是在多对一个时候没有默认解决,需要一个个排除。

同时有时json在序列化时,需要多它的关联的类中获取某个元素,或子类在序列化时需要父类的元素等。

 

可以通过重写flexjson的ObjectTransformer进行解决。

因为里面的TypeTransformerMap后来注册的对象类型只能是child,所以用了反射改变了它的方法,并在ObjectTransformer加入一些事件。通过json中的path来进行了过滤处理等。

 

 

public void transform(Object object) {
        JSONContext context = getContext();
        Path path = context.getPath();
        ChainedSet visits = context.getVisits();

        String pathStr = "";
        List<String> pathList = path.getPath();
        if (!pathList.isEmpty()) {
            pathStr = StringUtils.join(pathList, ".");
        }

        try {
            if (!visits.contains(object)) {
                context.setVisits(new ChainedSet(visits));
                context.getVisits().add(object);
                // traverse object
                BeanAnalyzer analyzer = BeanAnalyzer.analyze(resolveClass(object));
                TypeContext typeContext = context.writeOpenObject();
                for (BeanProperty prop : analyzer.getProperties()) {
                    String name = prop.getName();
                    path.enqueue(name);

                    //添加了属性过滤
                    String currPropPath = pathStr + name;
                    PropertyFilter propertyFilter = propertyFilterMap.get(currPropPath);
                    if (propertyFilter == null && propertyProcesserMap.get(currPropPath) == null) {
                        propertyFilter = propertyFilterMap.get("*");
                    }
                    if (propertyFilter != null && propertyFilter.isFilter(prop, path, object, context, typeContext)) {
                        path.pop();
                        continue;
                    }


                    if (context.isIncluded(prop)) {
                        Object value = prop.getValue(object);

                        //添加了属性值的处理
                        PropertyProcesser propertyProcesser = propertyProcesserMap.get(currPropPath);
                        if (propertyProcesser != null) {
                            value = propertyProcesser.propertyProcesser(prop, value, path, object, context, typeContext);
                        }

                        if (!context.getVisits().contains(value)) {

                            TransformerWrapper transformer = (TransformerWrapper) context.getTransformer(value);

                            if (!transformer.isInline()) {
                                if (!typeContext.isFirst()) context.writeComma();
                                typeContext.setFirst(false);
                                context.writeName(name);
                            }
                            typeContext.setPropertyName(name);

                            transformer.transform(value);
                        }
                    }
                    path.pop();
                }
                //添加了对于当前对象的处理                                       
                if (!objectProcesserMap.isEmpty()) {
                    ObjectProcesser objectProcesser = objectProcesserMap.get(pathStr);
                    if (objectProcesser != null) {
                        objectProcesser.objectProcesser(object, path, context, typeContext);
                    }
                }

                context.writeCloseObject();
                context.setVisits((ChainedSet) context.getVisits().getParent());

            }
        } catch (JSONException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
//            throw new JSONException("Error trying to deepSerialize", e);
        }
    }
 

 

 

具体代码在https://github.com/huanwuji/springbase/tree/master/src/main/java/com/huanwuji/utils/flexJson中

测试类:

只有写法,测试类不能用在

https://github.com/huanwuji/springbase/blob/master/src/test/com/huanwuji/tools/codeBatchCreate/FlexJsonTest.java中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值