fastjson格式化输出如何操作?fastjson如何过滤字段?

阳光 2021-08-17 18:07:32 java常见问答 10797

fastjson是目前java语言中最快的JSON库, 可以操作任何 Java 对象,并且在实际工作中,fastjson格式化也是常使用到的,那fastjson格式化输出如何操作?下面来我们就来给大家讲解一下。

1.项目的pom.xml依赖

<dependency >
    <groupId>com.alibaba</groupId> <
    artifactId > fastjson < /artifactId> <
    version > 1.2 .58 < /version> <
    /dependency>

2.Java示例代码

(1) 导入的包:

com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

(2) 测试代码:

其中JSON字符串为:

{
    "_index": "book_shop"
    , "_type": "it_book"
    , "_id": "1"
    , "_score": 1.0
    , "_source":
    {
        "name": "Java编程思想(第4版)"
        , "author": "[美] Bruce Eckel"
        , "category": "编程语言"
        , "price": 109.0
        , "publisher": "机械工业出版社"
        , "date": "2007-06-01"
        , "tags": ["Java", "编程语言"]
    }
}
public static void main(String[] args)
{
    String jsonString = "{\"_index\":\"book_shop\",\"_type\":\"it_book\",\"_id\":\"1\",\"_score\":1.0," +
        "\"_source\":{\"name\": \"Java编程思想(第4版)\",\"author\": \"[美] Bruce Eckel\",\"category\": \"编程语言\"," +
        "\"price\": 109.0,\"publisher\": \"机械工业出版社\",\"date\": \"2007-06-01\",\"tags\": [ \"Java\", \"编程语言\" ]}}";
    JSONObject object = JSONObject.parseObject(jsonString);
    String pretty = JSON.toJSONString(object, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue
        , SerializerFeature.WriteDateUseDateFormat);
    System.out.println(pretty);
}

(3) 格式化输出后的结果:

说明: FastJson通过Tab键进行换行后的格式化.

{
    "_index": "book_shop"
    , "_type": "it_book"
    , "_source":
    {
        "date": "2007-06-01"
        , "author": "[美] Bruce Eckel"
        , "price": 109.0
        , "name": "Java编程思想(第4版)"
        , "publisher": "机械工业出版社"
        , "category": "编程语言"
        , "tags": [
            
"Java",
            
"编程语言"
            
]
    }
    , "_id": "1"
    , "_score": 1.0
}

fastjson如何过滤字段?

方法一、FastJson的注解

@JSONField(serialize = false)
private String name;

最便捷,直接在实体的字段上加FastJson的注解serialize = false,转JSON字符串时就不会有该字段。

方法二、JAVA关键字

@JSONField(name = "AGE")
private transient String age;

在实体字段前面,使用transient关键字,表示该字段不参与序列化,转JSON字符串时就可以忽略掉该字段。因为是JAVA关键字所以也会影响该字段其他序列化操作。

方法三、FastJson的属性名过滤器

SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes()
    .add("PHONE");
System.out.println(JSONObject.toJSONString(u, filter));

通过SimplePropertyPreFilter过滤器,来过滤指定的属性名,然后在转JSON的时候,带上过滤器参数即可。

如果需要保留的参数比较少,也可以反过来,使用filter.getIncludes().add("PHONE");的方式来包含指定的字段。还可以直接在new的时候带上,这里是可变参数,所以可以同时指定多个,即如下这种写法:

SimplePropertyPreFilter filter = new SimplePropertyPreFilter("PHONE", 
"SEX");

注:这里的字段名为转成JSON后的key,不是实体的属性名。如例子中为大写SEX,而不是小写的sex。

方法四、FastJson的属性过滤器

PropertyFilter profilter = new PropertyFilter()
{
    @Override
    public boolean apply(Object object, String name, Object value)
    {
        if (name.equals("SEX"))
        {
            // false表示字段将被排除在外
            return false;
        }
        return true;
    }
};
System.out.println(JSON.toJSONString(u, profilter));

通过实现PropertyFilter接口的apply方法,来实现过滤属性,方法参数name即为字段的key,参数value即为字段的value,这种方式最强大,因为可以自定义具体过滤规则。方法返回false即为排除该字段。在转JSON的时候,带上过滤器参数即可。注:参数name指的字段名为转成JSON后的key,不是实体的属性名。如例子中为大写SEX,而不是小写的sex。

如果是JAVA8的话。可以使用lambda表达式,更简洁,如下:

PropertyFilter profilter = (object, name, value) - >
{
    if (name.equals("SEX"))
    {
        // false表示字段将被排除在外
        return false;
    }
    return true;
};

虽说在解决问题的过程中解决方法有很多,只要大家找到合适的方法去解决就可以了。fastjson过滤字段就是以上四种方法,大家可以选用一种进行过滤字段最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

java线程安全面试题有哪些?java线程安全面试题

java基础教程哪个好?如何规划学习java?

jar文件怎么用java打开?jar文件怎么运行?