net.sf.json PropertyNameProcessor 无法调用的问题

heavan2010 发布于 2013/03/21 19:29
阅读 1K+
收藏 2

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

问题说明:

    同事给的接口属性与我自定义的不对应,导致 json 转换为 对象的时候无法自动赋值。我自己写了个例子。使用JsonConfig 注册一个属性处理类(PropertyNameProcessor) ,结果json 转换为对象的时候,properNameProcessor 无法调用。相应代码如下:

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.PropertyNameProcessor;


import com.heavan.domain.PersonClass;


public class JsonUtil {


    public static void main(String[] args) {
        JsonConfig jsonConfig = new JsonConfig();

        PropertyNameProcessor processor = new PropertyNameProcessor(){
            @Override
            public String processPropertyName(Class beanClass, String name) {
                   System.out.println(beanClass);

                    //没有根据属性进行判断,统一返回了一个值
                   System.out.println(name);
                    return "boy";
            }
        };
        jsonConfig.registerJavaPropertyNameProcessor(com.heavan.domain.PersonClass.class,processor);
        //为了验证 获取的属性处理器是否相等
        System.out.println(processor);

        //底层代码是无法通过这个方法获取注册的事件,而我是可以正常获取的,我怀疑net.sf.json把属性处理器给我丢了
        PropertyNameProcessor demo = jsonConfig.findJavaPropertyNameProcessor(PersonClass.class);
        System.out.println(demo);

        String result = "{\"homeaddress\":\"山东\",\"password\":\"1112312\",\"username\":\"supername\"}";
       JSONObject jsonObject = JSONObject.fromObject(result,jsonConfig);
        Object bean = jsonObject.toBean(jsonObject,PersonClass.class);
        System.out.println(bean);

        }
}

个人分析的结果:见代码中的注释

     JsonObject源码304就是获取属性转换器的。即下面的方法。这里面获取的为空,所以方法没有调用。

      PropertyNameProcessor propertyNameProcessor = jsonConfig.findJavaPropertyNameProcessor( beanClass );
         if( propertyNameProcessor != null ){
            key = propertyNameProcessor.processPropertyName( beanClass, key );
         }


jar包的使用情况:

json-lib-2.4-jdk15.jar   //json-lib-2.1.jar 该jar包没有属性处理器

ezmorph-1.0.6.jar


求大神指教

    


加载中
0
heavan2010
heavan2010

问题已经解决: 

JsonConfig config = new JsonConfig();

config.registerJavaPropertyNameProcessor(UserVo.class, new PropertyNameProcessor(){
@Override
    public String processPropertyName(Class obj, String name) {
        if(name.equalsIgnoreCase("username"))
            return "name";
        else if(name.equalsIgnoreCase("password"))
            return "passwd";
            else
        return "other";
}
});
config.setRootClass(UserVo.class);
System.out.println(config);
String jsonStr = "{\"homeaddress\":\"山东\",\"password\":\"1112312\",\"username\":\"supername\"}";
JSONObject obj = JSONObject.fromObject(jsonStr);
System.out.println(config);
Object o = JSONObject.toBean(obj, config);
System.out.println(o); 


解析:

 toBean( JSONObject jsonObject, JsonConfig jsonConfig )
只有这个方法才实现转换的调用
public static Object toBean( JSONObject jsonObject, Class beanClass ) {
      JsonConfig jsonConfig = new JsonConfig();
      jsonConfig.setRootClass( beanClass );
      return toBean( jsonObject, jsonConfig );
   }

 这个里面是new了一个config所以丢了 

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部