对象转 json对象

问题1:  

 需求:对象转 json对象 时,如果属性值为null的话,无论它的类型是String,Integer,Boolean,Date....,转json对象后,它的属性值都要为null,而不是默认的 “” 或者0。如此需求,关键是数据库查询时若为不等于,则排除不等于还排除了null(实际上是从""及许多非null值中找满足不等于这个条件).但elasticsearch查询果不等于就是不等于。而且把数据库存es时,所有的null属性值都被转为 "" 了。

   疑惑:在网上没有找到现成的工具或者方法。有的可以实现如此需求,但不支持数组。

   解决方法:在同事的指导下,直接修改 net.sf.json.JSONObject 的源码,问题解决。

   详细说明:

  1.找到 json-lib-2.4-jdk15.jar 的源码包,解压,把源码拷到本项目下,然后启动项目,并打断点。

  2.跟踪转json对象时它所调用的方法,并分析它对不同类型的null值如何处理。

  3.修改。并调试。

  4.把能满足需求并修改了的java文件编译后的class文件拷贝到原jar包相应的目录下。

  5.再一次测试,同时删除先前拷的源码。

  总结及感想:

  1.以后遇到类似的问题时,就可以如此处理。有些工具其实只要修改一点点就完全可以满足要求,也不 需要想得特别神圣,不必望而却步。

  2.源码还是经常要看的。关注别人的编码风格及比较好的思路。

问题2:

         转json对象的,Date要转为指定的格式,而不是转为默认的一个日期数组或者其它格式。简单就是:配置config,实现JsonValueProcessor,实现实现两个函数processObjectValue和processArrayValue。


具体见以下源码:

使用时如此写:

	private <T> String getJsonString(T obj) {
		JsonConfig config = new JsonConfig();
		JsonDateValueProcessor jsonValueProcessor = new JsonDateValueProcessor();
		config.registerJsonValueProcessor(Date.class, jsonValueProcessor);
		JSONObject json = JSONObject.fromObject(obj, config);
		return json.toString();
	}

JsonDateValueProcessor 类

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class JsonDateValueProcessor implements JsonValueProcessor {
	private String pattern = "yyyy/MM/dd";

	public Object processArrayValue(Object value, JsonConfig config) {
		return process(value);
	}

	public Object processObjectValue(String key, Object value, JsonConfig config) {
		return process(value);
	}

	private Object process(Object value) {
		if (value instanceof Date) {
			SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.UK);
			return sdf.format(value);
		} else if (value == null) {
			return null;
		} else {
			return value.toString();
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值