`
幻无极
  • 浏览: 7255 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
文章分类
社区版块
存档分类
最新评论

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中。

分享到:
评论

相关推荐

    jackson 和flexjson 的性能及比较

    而Flexjson虽然也能实现类似的功能,但其灵活性和可扩展性稍逊一筹。 总的来说,Jackson更适合大型项目或性能敏感的环境,它的功能强大且性能优秀。而Flexjson则更适合小型项目或需要快速原型开发的场合,其简单...

    flexJson.jar包,和列子

    在"flexJson.jar包,和列子"这个主题中,我们将深入探讨FlexJson库的核心功能以及如何在实际应用中使用它进行JSON转换。首先,我们来看一下FlexJson库的基本用法。 1. **序列化**:将Java对象转换为JSON字符串 - ...

    flexjson组件

    3. **使用Flexjson-2.0**:在Java项目中,首先需要引入flexjson-2.0.jar这个库。通过Maven或Gradle等构建工具,可以直接添加依赖。如果是传统的Java项目,可以通过将jar文件添加到项目的类路径来使用。 4. **序列化...

    flexjson-2.1.zip

    通过使用Flexjson,你可以控制哪些关联对象应该被包含在JSON输出中,哪些应该被忽略,从而避免触发Hibernate的延迟加载机制。 在使用Flexjson时,有以下关键知识点: 1. **对象序列化(Serialization)**:...

    JSON类库 Flexjson

    - 官方文档: 详细了解Flexjson的使用和配置可以通过访问其官方网站获取。 - 示例代码: 通过阅读和运行示例代码,可以更好地理解Flexjson的用法。 - 社区讨论: Stack Overflow和其他开发者论坛上有许多关于...

    FlexJson1.7 Jar包

    Flexjson is a lightweight library for serializing Java objects into JSON. FlexJson,一个轻量级的Jar库,可以将Java对象序列化成Json格式

    flexJson.jar包 json序列化工具包

    flexJson.jar包 用于json序列化开发

    JSON类库 Flexjson.7z

    使用Flexjson时,开发人员需要注意的是,虽然它提供了一种简单的方法来处理JSON,但在处理复杂的数据结构时,可能需要花费更多的时间来配置和管理序列化和反序列化的规则。此外,对于大型项目,可能需要考虑使用更...

    FlexjsonDemo

    在提供的"FlexjsonDemo"示例中,很可能包含了如何使用Flexjson进行序列化和反序列化的代码示例,包括创建Java对象、调用Flexjson API进行转换以及可能的自定义序列化和反序列化策略。通过查看这个示例,你可以更直观...

    flexjson-2.1源码

    flexjson-2.1源码

    基于java的开发源码-JSON类库 Flexjson.zip

    基于java的开发源码-JSON类库 Flexjson.zip 基于java的开发源码-JSON类库 Flexjson.zip 基于java的开发源码-JSON类库 Flexjson.zip 基于java的开发源码-JSON类库 Flexjson.zip 基于java的开发源码-JSON类库 Flexjson...

    msm-flexjson-serializer-1.8.2.zip

    总之,Groovy Liquibase和Flexjson是现代数据库管理的重要工具,它们结合使用能极大地提升数据库重构的效率和质量。通过深入学习和实践,开发者不仅可以提升自身技能,还能为项目的数据库管理带来显著的改进。

    基于Java的源码-JSON类库 Flexjson.zip

    让我们深入探讨Flexjson的核心功能、使用场景和其与JSON的关联。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它常用于服务器向客户端传递...

    基于java的JSON类库 Flexjson.zip

    在实际开发中,Flexjson可以与其他Java框架(如Spring、Struts等)结合使用,提高数据交换的效率和便利性。对于处理JSON数据的需求,无论是简单的Web服务还是复杂的分布式系统,Flexjson都是一个值得考虑的选择。...

    java源码:JSON类库 Flexjson.zip

    下面将详细探讨Flexjson库的主要特性和使用方法。 Flexjson的基本概念是它提供了两种主要的操作方式:序列化(Serializing)和反序列化(Deserializing)。序列化是将Java对象转换成JSON字符串的过程,而反序列化则...

    基于Java的实例开发源码-JSON类库 Flexjson.zip

    下面我们将深入探讨Flexjson库的使用和特点。 Flexjson的主要功能包括: 1. **序列化**:Flexjson可以将Java对象转换为JSON字符串,这对于将数据发送到服务器或存储在文件中非常有用。例如,你可以使用`new JSON()...

    基于Java的实例源码-JSON类库 Flexjson.zip

    总结来说,Flexjson是一个强大且易于使用的Java JSON库,尤其适用于快速开发和测试环境。它提供了丰富的功能,能够满足大多数JSON操作需求,对于Java开发者来说是处理JSON数据的一个理想选择。通过深入学习和实践,...

    JAVA源码JSON类库Flexjson

    JAVA源码JSON类库Flexjson

Global site tag (gtag.js) - Google Analytics