Статьи

Как использовать PropertyNamingStrategy в Джексоне

API Джексона широко используется для преобразования json в Object и Object в JSON. Поэтому, если у вас есть строка json и вы хотите преобразовать ее в объект java, создайте имена полей bean-компонентов, такие же, как поля в json. Джексон следует стандартному соглашению bean при отображении полей json в поля объектов java, но если у вас есть json, который не следует соглашениям об именах [для ex-полей, начинающихся с заглавной буквы], Джексон не знает, как сопоставить эти поля с вашим объектом java. Вы можете использовать аннотацию @JsonProperty , но иногда трудно поместить эту аннотацию в каждое поле каждого класса. Именно здесь в снимок входит PropertyNamingStrategy . Вы можете изменить этот класс в соответствии с вашими потребностями.

Давайте возьмем пример. У нас есть JSON, как это:

1
{'CustName':'Abhishek Somani','Result':null,'CustNo':'1234'}

Обратите внимание, что первая буква каждого поля — это заглавная буква, что не является стандартным соглашением об именовании бинов. И мы пытаемся отобразить этот JSON на следующий бин:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JsonBean {
 /**
  *
  */
 
 private String custNo ;
 private String custName ;
 private String result;
 
 public String getResult() {
  return result;
 }
 public void setResult(String result) {
  this.result = result;
 }
 public String getCustNo() {
  return custNo;
 }
 public void setCustNo(String custNo) {
  this.custNo = custNo;
 }
 public String getCustName() {
  return custName;
 }
 public void setCustEm(String custName) {
  this.custName = custName;
 }
}

Чтобы отобразить этот json на jsonBean, нам нужно создать собственную стратегию именования, подобную этой. Здесь мы конвертируем первую букву имени поля в верхний регистр.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import org.codehaus.jackson.map.MapperConfig;
import org.codehaus.jackson.map.PropertyNamingStrategy;
import org.codehaus.jackson.map.introspect.AnnotatedField;
import org.codehaus.jackson.map.introspect.AnnotatedMethod;
 
public class MyNameStrategy extends PropertyNamingStrategy
 {
  @Override
  public String nameForField(MapperConfig
                       config,
   AnnotatedField field, String defaultName) {
     return convert(defaultName);
 
  }
  @Override
  public String nameForGetterMethod(MapperConfig
                       config,
   AnnotatedMethod method, String defaultName) {
     return convert(defaultName);
  }
 
  @Override
  public String nameForSetterMethod(MapperConfig
                       config,
    AnnotatedMethod method, String defaultName) {
   String a = convert(defaultName);
   return a;
  }
 
  public String convert(String defaultName )
  {
   char[] arr = defaultName.toCharArray();
   if(arr.length !=0)
   {
    if ( Character.isLowerCase(arr[0])){
     char upper = Character.toUpperCase(arr[0]);
     arr[0] = upper;
    }
   }
   return new StringBuilder().append(arr).toString();
  }
 
 }

Это основной класс для тестирования. Мы устанавливаем нашу customNamingStrategy в ObjectMapper из Джексона.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.File;
import java.io.IOException;
 
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
 
public class JsonTest {
 
 public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
  ObjectMapper mapper = new ObjectMapper();
  mapper.setPropertyNamingStrategy(new MyNameStrategy());
  File f = new File('F:/abc.json');
  JsonBean bean = (JsonBean)mapper.readValue(f, JsonBean.class);
 
  mapper.writeValue(new File('F:/abc1.json'),bean);
 
  System.out.println(bean.getCustEm());
 }
 
}

Если вы не предоставите стратегию именования, вы получите исключение, подобное этому:

1
Exception in thread 'main' org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field 'CustNo' (Class JsonBean), not marked as ignorable

Ссылка: Как использовать PropertyNamingStrategy в Джексоне от нашего партнера по JCG Абхишека Сомани из блога Java, J2EE, Server .