Jackson - Java bean到JSON字符串:大写变量在JSON

时间:2016-06-07 11:49:23

标签: java json jackson javabeans

我正在使用ObjectMapper的writeValueAsString方法将Java bean转换为JSON字符串,其中来自Java bean的大写变量在JSON字符串中被更改为小写。 杰克逊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);
}

}

早些时候,我们使用的是net.sf.json.JSON&amp;用于Java bean到JSON转换的JSONSerializer。并且生成的JSON字符串具有与我们使用Java bean类似的命名。由于性能问题,我想改变这个&amp;实施杰克逊。

限制:我们无法更改Java bean命名约定,因为这些bean来自较旧的项目,并且几乎没有空间来更改bean中的变量名,甚至在每个bean中添加json属性。

我尝试了下面的代码但是没有用

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);

另外,我尝试过定制的PropertyNamingStrategy,但不清楚。

已编辑:

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

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

杰克逊为上面的bean生成了JSON字符串:

{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}

你可以看到&#34; XId&#34;转换为&#34; xid&#34;在杰克逊和&#34; PNRNumber&#34;转换为&#34; pnrnumber&#34;在杰克逊。

杰克逊是否有任何配置更改可以避免此类修改。 或者如何处理这种情况。

2 个答案:

答案 0 :(得分:4)

使用了以下罐子:

  
      
  1. 杰克逊 - 芯 - 2.7.4.jar
  2.   
  3. 杰克逊 - 注解-2.7.4.jar
  4.   
  5. 杰克逊 - 数据绑定-2.7.4.jar
  6.   

步骤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();
}

第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);   
  }
}

步骤3:现在是时候获取json String,如下所示:

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 ); 

输出:

  

JSON:   { “XID”:11 “PNRNumber”: “123456789”, “minPriced”:[{ “名称”: “JSON”},{ “名称”: “简单”}]}

希望这有帮助。

答案 1 :(得分:1)

添加带有必需键箱的Json属性。用小写字母创建变量。

public class BaseBean {

@JsonProperty("XId")
private int xId;
..
}

希望这会有所帮助