Jackson - Java bean 到 JSON 字符串:大写变量在 JSON 中转换为小写
Jackson - Java bean to JSON string : uppercase variable converted into lowercase in JSON
我正在使用 ObjectMapper 的 writeValueAsString 方法将 Java bean 转换为 JSON 字符串,其中来自 Java bean 的大写变量在 JSON 字符串中被更改为小写。
Jackson 2.7.4 版本实现。
基础 bean 样本 -
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 & JSONSerializer 将 Java bean 转换为 JSON。生成的 JSON 字符串与我们拥有的 Java bean 具有相似的命名。由于性能问题,我想更改此设置并实施 Jackson。
限制:我们无法更改 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 为上面的 bean 生成了 JSON 字符串:
{"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}
Jackson 为上述 bean 生成了 JSON 字符串:
{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}
如您所见,"XId" 在 jackson 中转换为 "xid",而 "PNRNumber" 在 jackson 中转换为 "pnrnumber"。
Jackson 中是否有任何可用的配置更改以避免此类修改。
或者如何处理这种情况。
已使用以下罐子:
- jackson-core-2.7.4.jar
- jackson-annotations-2.7.4.jar
- jackson-databind-2.7.4.jar
第一步:请按照如下方式编写以下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 字符串的时候了,如下所示:
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":[{"name":"JSON"},{"name":"simple"}]}
希望这对您有所帮助。
添加 Json 属性 和所需的钥匙包。用小写字母创建变量。
public class BaseBean {
@JsonProperty("XId")
private int xId;
..
}
希望这会有所帮助
我正在使用 ObjectMapper 的 writeValueAsString 方法将 Java bean 转换为 JSON 字符串,其中来自 Java bean 的大写变量在 JSON 字符串中被更改为小写。 Jackson 2.7.4 版本实现。 基础 bean 样本 -
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 & JSONSerializer 将 Java bean 转换为 JSON。生成的 JSON 字符串与我们拥有的 Java bean 具有相似的命名。由于性能问题,我想更改此设置并实施 Jackson。
限制:我们无法更改 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 为上面的 bean 生成了 JSON 字符串:
{"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}
Jackson 为上述 bean 生成了 JSON 字符串:
{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}
如您所见,"XId" 在 jackson 中转换为 "xid",而 "PNRNumber" 在 jackson 中转换为 "pnrnumber"。
Jackson 中是否有任何可用的配置更改以避免此类修改。 或者如何处理这种情况。
已使用以下罐子:
- jackson-core-2.7.4.jar
- jackson-annotations-2.7.4.jar
- jackson-databind-2.7.4.jar
第一步:请按照如下方式编写以下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 字符串的时候了,如下所示:
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":[{"name":"JSON"},{"name":"simple"}]}
希望这对您有所帮助。
添加 Json 属性 和所需的钥匙包。用小写字母创建变量。
public class BaseBean {
@JsonProperty("XId")
private int xId;
..
}
希望这会有所帮助