Это первый день моего участия в 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.
Мы видим, что поле age теряется после преобразования в JSON, что может вызвать исключения преобразования json, когда мы не можем получить его с объектом или преобразовать в объект, или иногда бывает, когда это поле пусто. значение по умолчанию;
решение:
Просмотрите исходный код JSON.toJSONString():
Как и выше, вы можете обнаружить, что 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;
}
}
Результат:
Ok! Для решения проблемы конечно метод toJSONString имеет множество расширений.Например, когда мы хотим вывести конкретный символ, когда он пуст, нам нужно использовать фильтр.Присмотритесь к другим методам JSON.toJSONString
В 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! Это конец статьи. Я надеюсь, что это может быть полезно для всех. Первое написание не очень хорошо. Редактор будет постепенно его исправлять. Если что-то не так, я надеюсь, что все смогут исправить это и расти вместе;
Чистота делает код отличным, а в деталях только небо и земля