物件轉json字串的過程中對value為null的值的一些處理

木子廣發表於2020-09-25

系列文章目錄

提示:這裡可以新增系列文章的所有文章的目錄,目錄需要自己手動新增
例如:第一章 Python 機器學習入門之pandas的使用


提示:寫完文章後,目錄可以自動生成,如何生成可參考右邊的幫助文件


前言

提示:這裡可以新增本文要記錄的大概內容:
例如:隨著人工智慧的不斷髮展,機器學習這門技術也越來越重要,很多人都開啟了學習機器學習,本文就介紹了機器學習的基礎內容。


提示:以下是本篇文章正文內容,下面案例可供參考

一、pandas是什麼?

示例:pandas 是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。

二、使用步驟

1.引入庫

程式碼如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.讀入資料

程式碼如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

該處使用的url網路請求的資料。


提示:這裡對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理資料的函式和方法。

fastjson,物件轉json字串的過程中對value為null的值的一些處理

前言

fastjson是一個非常好用的java庫,用於操作物件json序列化等等。

問題
最近在寫程式碼的時候遇到問題,通過JSON.toJSONString方法將一個實體物件轉為json字串,轉出來發現原本
物件中value為null的欄位被過濾掉了。。。

總結

1.實體物件

package so.sao.code;

import lombok.Data;

@Data
public class Person {

    String name;

    String gender;

    String nickname;

    String phone;

}

測試程式碼

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("wyz");
        String json = JSON.toJSONString(person);
        System.out.println(json);
    }

輸出結果

發現只有設定了值的欄位name才有輸出,而其餘為空的欄位則都被過濾掉了

解決
怎樣讓值為null的key不被過濾掉
設定SerializerFeature
設定SerializerFeature裡面有很多特性可以使用

要讓空值也能夠輸出的特性值是SerializerFeature.WriteMapNullValue

改造程式碼:

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("wyz");
//        String json = JSON.toJSONString(person);
//        System.out.println(json);

        // 設定SerializerFeature
        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
    }

輸出結果:

值為null屬性直接放到json字串裡面不太好看,能不能把null值轉成其他的值,比如空字串
這個時候就需要用到過濾器了,仔細看看JSON.toJSONString的其他幾個方法

toJSONString方法中可以放一個或多個過濾器,常用的過濾器有以下幾種:

要實現把null值轉為空字串的效果可以使用ValueFilter

程式碼實現:

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("wyz");
//        String json = JSON.toJSONString(person);
//        System.out.println(json);

        // 設定SerializerFeature
//        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));

        // 設定NameFilter
        System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
            if(value == null){
                return "";
            }

            return value;
        }));
    }

輸出結果:

一個特殊的需求,有的值為null需要過濾,有的又不需要過濾。。。(這就是我遇到的)
使用PropertyFilter

程式碼實現:

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("wyz");
//        String json = JSON.toJSONString(person);
//        System.out.println(json);

        // 設定SerializerFeature
//        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));

        // 設定NameFilter
//        System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
//            if(value == null){
//                return "";
//            }
//
//            return value;
//        }));

        // 設定PropertyFilter
        System.out.println(JSON.toJSONString(person, new PropertyFilter() {
            @Override
            public boolean apply(Object object, String name, Object value) {
                return name.equals("gender") || value != null;
            }
        }, SerializerFeature.WriteMapNullValue));
    }

輸出結果:

相關文章