【开源中国 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
求大神指教
问题已经解决:
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);
解析:
只有这个方法才实现转换的调用
public static Object toBean( JSONObject jsonObject, Class beanClass ) {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setRootClass( beanClass );
return toBean( jsonObject, jsonConfig );
}