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 .