Руководство по предотвращению ям Java: помните ошибку, доставленную FastJson

Java задняя часть
Руководство по предотвращению ям Java: помните ошибку, доставленную FastJson

Это первый день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов

Мяу Джун Таун Билдинг, это первый раз, когда я написал статью в Наггетс, письмо не очень хорошее, все, Хайхан

Деловая сцена:

Восходящая служба преобразует бизнес-объект в формат JSON и передает его нижестоящей службе для использования через сообщение mq.

появляется проблема:

Недавно столкнулся с проблемой при написании кода, преобразовал объект сущности в строку json через метод JSON.toJSONString, а получилось найти оригинал Поля, значение которых в объекте равно null, отфильтровываются. . . Когда нижестоящая служба использует JSON для объекта после получения сообщения от mq, она обнаруживает, что некоторые поля отсутствуют, что приводит к ненормальному преобразованию JSON.

net.sf.json.JSONException:java.lang.reflect.InvocationTargetException

Конкретный бизнес-код не является липким, и я напишу небольшую демонстрацию для вас, чтобы перечислить:

@Test
    public void test(){
        user user = new user();
        user.setName("张三");
        user.setSchool("武汉大学");
        String jsonString = JSON.toJSONString(user);
        System.out.println("对象 -》JSON "+jsonString);
    }

    
    @Data
    class user{
        private String name;
        private String age;
        private String school;
    }

Как и в приведенном выше коде, когда поле age в объекте User пусто, в это время оно преобразуется в json.

图片.png

Мы видим, что поле age теряется после преобразования в JSON, что может вызвать исключения преобразования json, когда мы не можем получить его с объектом или преобразовать в объект, или иногда бывает, когда это поле пусто. значение по умолчанию;

решение:

Просмотрите исходный код JSON.toJSONString():

图片.pngКак и выше, вы можете обнаружить, что toJSONString() имеет несколько перегруженных методов. Здесь нам нужно настроить свойство SerializerFeature для метода toJSONString.

Класс перечисления для свойства SerializerFeature выглядит следующим образом:

стоимость иллюстрировать
QuoteFieldNames Использовать ли двойные кавычки при выводе ключа, значение по умолчанию — true
WriteMapNullValue Выводить ли поле, значение которого равно null, по умолчанию — false
WriteNullNumberAsZero Если поле значения равно null, вывод равен 0, а не null
WriteNullListAsEmpty Если поле списка равно null, вывод будет [] вместо null
WriteNullStringAsEmpty Если поле типа символа равно null, вывод будет "" вместо null
WriteNullBooleanAsFalse Если логическое поле имеет значение null, вывод будет ложным, а не нулевым.

После изменения кода:

@Test
    public void test(){
        user user = new user();
        user.setName("张三");
        user.setSchool("武汉大学");
        String jsonString = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
        System.out.println("对象 -》JSON "+jsonString);
    }


    @Data
    class user{
        private String name;
        private String age;
        private String school;
    }
}

Результат:

图片.pngOk! Для решения проблемы конечно метод toJSONString имеет множество расширений.Например, когда мы хотим вывести конкретный символ, когда он пуст, нам нужно использовать фильтр.Присмотритесь к другим методам JSON.toJSONString

图片.pngВ JSON.toJSONString много фильтров, конкретные не группируются, если интересно, можете посмотреть исходный код, вот только пример:

@Test
    public void test(){
        user user = new user();
        user.setName("张三");
        user.setSchool("武汉大学");
        String jsonString = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
        System.out.println(JSON.toJSONString(user, (ValueFilter) (name, age, school) -> {
            if(age == null){
                return "18";
            }

            return age;
        }));
        System.out.println("对象 -》JSON "+jsonString);
    }


    @Data
    class user{
        private String name;
        private String age;
        private String school;
    }

Вот и все!

Вы закончили с этим?Авкас Наут! ! !

Конечно, у него есть и более мощное место — это PropertyFilter. Например, некоторые наши значения нулевые и их нужно фильтровать, а некоторые не нужно фильтровать, в это время приходит Filter.

@Test
    public void test(){
        user user = new user();
        user.setName("张三");
        user.setSchool("武汉大学");
        String jsonString = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
        System.out.println(JSON.toJSONString(user, (ValueFilter) (name, age, school) -> {
            if(age == null){
                return "18";
            }

            return age;
        }));

        System.out.println(JSON.toJSONString(user, new PropertyFilter() {
            @Override
            public boolean apply(Object object, String name, Object value) {
                return name.equals("张三") || value != null;
            }
        }, SerializerFeature.WriteMapNullValue));
    }
        System.out.println("对象 -》JSON "+jsonString);
    }


    @Data
    class user{
        private String name;
        private String age;
        private String school;
    }

Ok! Это конец статьи. Я надеюсь, что это может быть полезно для всех. Первое написание не очень хорошо. Редактор будет постепенно его исправлять. Если что-то не так, я надеюсь, что все смогут исправить это и расти вместе;

Чистота делает код отличным, а в деталях только небо и земля