关于JSONObject解析json数据,获取不到指定key的问题

时间:2021-03-14 19:18:04
调用别家的api接口返回的参数名首字母是大写的,而根据JSONObject解析方式是不支持参数名首字母大写,有人遇到过这个问题么?有啥解决方案。
json数据如下:
{"AutoCode":"1"}

bean如下:
public class AutoCode {
private String AutoCode;

public String getAutoCode() {
return AutoCode;
}

public void setAutoCode(String AutoCode) {
this.AutoCode = AutoCode;
}

}

控制台输出:2012-4-11 12:01:22 net.sf.json.JSONObject toBean
警告: Tried to assign property AutoCode:java.lang.String to bean of class com.roiland.bean.AutoCode
把json数据首字母小写就ok了,但是这个数据不是我们能控制的,希望能提供类似JSONObject键值对重写之类的方法。

11 个解决方案

#1


    String json = "{\"AutoCode\":\"1\"}";
    JSONObject jsonObject = JSONObject.fromObject(json);
    JsonConfig config = new JsonConfig();
    config.setJavaIdentifierTransformer(new JavaIdentifierTransformer() {


      @Override
      public String transformToJavaIdentifier(String str) {
        char[] chars = str.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
      }
      
    });
    config.setRootClass(Test.class);
    Object bean = JSONObject.toBean(jsonObject , config);
    System.out.println(bean);

#2


setRootClass(AutoCode.class);

用好JsonConfig,然后其中的JavaIdentifierTransformer还有其他功能需要考虑,
比如json中的"xxx yyyy" ==> "xxxYyyy" 或者诸如此类,可以参考JavaIdentifierTransformer中几个默认的实现。

#3


如果你们几乎所有JSON处理都有这个问题,专门写个JavaIdentifierTransformer类,甚至是专门定制一个全局的JsonConfig对象

#4


这个好像是由于java的get和set方法导致的,不论你写autoCode还是AutoCode的都是getAutoCode,JSONObject封装数据的时候就认为字段名应该是autoCode

#5


引用 3 楼  的回复:
如果你们几乎所有JSON处理都有这个问题,专门写个JavaIdentifierTransformer类,甚至是专门定制一个全局的JsonConfig对象

这个JsonConfig里没看到有配置忽略大小写的配置,能讲下怎么配能搞定这种问题么?

#6


引用 1 楼  的回复:
Java code
    String json = "{\"AutoCode\":\"1\"}";
    JSONObject jsonObject = JSONObject.fromObject(json);
    JsonConfig config = new JsonConfig();
    config.setJavaIdentifierTransformer(new Jav……

厉害,无视大小写了,而且不影响value的大小写

#7


transformToJavaIdentifier接口,就是传进来JSON中的key,返回JavaBean中的property,甚至可以毫无关系的两个值
比如JSON的"jsonKey" ---> JavaBean的 "javaProperty"

#8


引用 7 楼  的回复:
transformToJavaIdentifier接口,就是传进来JSON中的key,返回JavaBean中的property,甚至可以毫无关系的两个值
比如JSON的"jsonKey" ---> JavaBean的 "javaProperty"

恩,api里竟然有用Class当字段名的,在javabean里根本写不了get&set方法,得用你的方式重新起名

#9


今天做项目也遇到同样的问题,不知道楼主是如何解决的,可否分享下经验,谢谢

#10


JSONObject put进入的东西  怎样实现排序?有没有人遇到过?

#11


可以使用google-gson,不会强制你小写的。



并且JSONObject这种,在android下是不行的,有冲突。

#1


    String json = "{\"AutoCode\":\"1\"}";
    JSONObject jsonObject = JSONObject.fromObject(json);
    JsonConfig config = new JsonConfig();
    config.setJavaIdentifierTransformer(new JavaIdentifierTransformer() {


      @Override
      public String transformToJavaIdentifier(String str) {
        char[] chars = str.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
      }
      
    });
    config.setRootClass(Test.class);
    Object bean = JSONObject.toBean(jsonObject , config);
    System.out.println(bean);

#2


setRootClass(AutoCode.class);

用好JsonConfig,然后其中的JavaIdentifierTransformer还有其他功能需要考虑,
比如json中的"xxx yyyy" ==> "xxxYyyy" 或者诸如此类,可以参考JavaIdentifierTransformer中几个默认的实现。

#3


如果你们几乎所有JSON处理都有这个问题,专门写个JavaIdentifierTransformer类,甚至是专门定制一个全局的JsonConfig对象

#4


这个好像是由于java的get和set方法导致的,不论你写autoCode还是AutoCode的都是getAutoCode,JSONObject封装数据的时候就认为字段名应该是autoCode

#5


引用 3 楼  的回复:
如果你们几乎所有JSON处理都有这个问题,专门写个JavaIdentifierTransformer类,甚至是专门定制一个全局的JsonConfig对象

这个JsonConfig里没看到有配置忽略大小写的配置,能讲下怎么配能搞定这种问题么?

#6


引用 1 楼  的回复:
Java code
    String json = "{\"AutoCode\":\"1\"}";
    JSONObject jsonObject = JSONObject.fromObject(json);
    JsonConfig config = new JsonConfig();
    config.setJavaIdentifierTransformer(new Jav……

厉害,无视大小写了,而且不影响value的大小写

#7


transformToJavaIdentifier接口,就是传进来JSON中的key,返回JavaBean中的property,甚至可以毫无关系的两个值
比如JSON的"jsonKey" ---> JavaBean的 "javaProperty"

#8


引用 7 楼  的回复:
transformToJavaIdentifier接口,就是传进来JSON中的key,返回JavaBean中的property,甚至可以毫无关系的两个值
比如JSON的"jsonKey" ---> JavaBean的 "javaProperty"

恩,api里竟然有用Class当字段名的,在javabean里根本写不了get&set方法,得用你的方式重新起名

#9


今天做项目也遇到同样的问题,不知道楼主是如何解决的,可否分享下经验,谢谢

#10


JSONObject put进入的东西  怎样实现排序?有没有人遇到过?

#11


可以使用google-gson,不会强制你小写的。



并且JSONObject这种,在android下是不行的,有冲突。