Jackson - Java bean 到 JSON 字符串:大写变量在 JSON 中转换为小写

San*_*osh 2 java json javabeans jackson

我正在使用 ObjectMapper 的 writeValueAsString 方法将 Java bean 转换为 JSON 字符串,其中来自 Java bean 的大写变量在 JSON 字符串中被更改为小写。Jackson 2.7.4 版本已实现。基豆样品 -

public class BaseBean {

private static final long serialVersionUID = 3947489072259877540L;

private int _iXId;
private String _sPNR;
private ArrayList _alMinPriced = new ArrayList<TermBean>();

public int getXId() {
    return _iXId;
}

public void setXId(int id) {
    _iXId = id;
}

public String getPNRNumber() {
    return _sPNR;
}

public void setPNRNumber(String _spnr) {
    _sPNR = _spnr;
}

public ArrayList getMinPriced() {
    return _alMinPriced;
}

public void setMinPriced(ArrayList minPriced) {
    _alMinPriced = minPriced;
}

public void setMinPriced(TermBean bnTerm) {
    _alMinPriced.add(bnTerm);
}
Run Code Online (Sandbox Code Playgroud)

}

早些时候,我们使用 net.sf.json.JSON 和 JSONSerializer 进行 Java bean 到 JSON 的转换。生成的 JSON 字符串与我们使用的 Java bean 具有相似的命名。由于性能问题,我想改变这一点并实施杰克逊。

限制:我们无法更改 Java bean 命名约定,因为这些 bean 来自较旧的项目,并且更改 bean 中的变量名称甚至在每个 bean 中添加 json 属性的余地很小。

我试过下面的代码,但没有奏效

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
Run Code Online (Sandbox Code Playgroud)

此外,我尝试过自定义 PropertyNamingStrategy 但对此不清楚。

编辑:

net.sf.json.JSON为上面的 bean 生成 JSON 字符串,如下所述:

{"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}
Run Code Online (Sandbox Code Playgroud)

Jackson为上面的 bean 生成了如下所述的 JSON 字符串:

{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}
Run Code Online (Sandbox Code Playgroud)

如您所见,jackson 中的“XId”转换为“xid”,jackson 中的“PNRNumber”转换为“pnrnumber”。

Jackson 中是否有任何可用的配置更改来避免此类修改。或如何处理这种情况。

San*_*aha 5

使用了以下罐子:

  1. 杰克逊核心2.7.4.jar
  2. jackson-annotations-2.7.4.jar
  3. 杰克逊-数据绑定-2.7.4.jar

步骤 1:请按如下方式编写以下 Mixin:

import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonProperty;

public abstract class MixIn {
    @JsonProperty("PNRNumber")
    abstract String getPNRNumber();

    @JsonProperty("XId")
    abstract int getXId();

    @JsonProperty("minPriced")
    abstract ArrayList getMinPriced();
}
Run Code Online (Sandbox Code Playgroud)

第 2 步:请按如下方式编写您的模块:-

import com.fasterxml.jackson.databind.module.SimpleModule;

public class MyModule extends SimpleModule{
  public MyModule() {
    super("ModuleName");
  }
  @Override
  public void setupModule(SetupContext context){
    context.setMixInAnnotations(BaseBean.class, MixIn.class);   
  }
}
Run Code Online (Sandbox Code Playgroud)

第 3 步:现在是获取 json 字符串的时候了,如下所示:

TermBean bean1=new TermBean("JSON");
TermBean bean2=new TermBean("simple");
ArrayList list=new ArrayList();
        list.add(bean1);
        list.add(bean2);
BaseBean bb=new BaseBean();
        bb.setXId(11);
        bb.setPNRNumber("123456789");
        bb.setMinPriced(list);

ObjectMapper mapper = new ObjectMapper();
Module myModule = new MyModule();
mapper.registerModule(myModule);        
String jsonInString = mapper.writeValueAsString(bb);      
System.out.printf( "JSON: %s", jsonInString ); 
Run Code Online (Sandbox Code Playgroud)

输出:

JSON: {"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}

希望这可以帮助。