Jackson api被广泛用于将json转换为Object并将Object转换为JSON。因此,如果您有json字符串并想在java对象中进行转换,请创建与json中的字段相同的bean的字段名。 Jackson在将json字段映射到java对象字段时遵循标准的bean约定,但是如果您有一个不遵循命名约定的json(对于以大写字母开头的ex字段),jackson不知道如何将该字段与您的java对象映射。 您可以使用@JsonProperty批注,但有时很难在每个类的每个字段上都使用此批注。这就是PropertyNamingStrategy的 用意 。 您可以根据需要修改此类。
让我们举个例子。 我们有一个像这样的json:
{'CustName':'Abhishek Somani','Result':null,'CustNo':'1234'}
请注意,每个字段的首字母均为大写字母,这不是标准的bean命名约定。 我们正在尝试将此json映射到以下bean:
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,我们必须创建自己的自定义命名策略,如下所示。 在这里,我们将字段名称的首字母转换为大写。
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();
}
}
这是要测试的主要课程。 我们正在Jackson的ObjectMapper中设置customNamingStrategy。
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());
}
}
如果您无法提供命名策略,则将获得Exception,如下所示:
Exception in thread 'main' org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field 'CustNo' (Class JsonBean), not marked as ignorable
参考: Java,J2EE和Server博客上JCG合作伙伴 Abhishek Somani的Jackson中的PropertyNamingStrategy用法 。
翻译自: https://www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html