Skip to content

carteryh/fastjson_demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

fastjson_demo

fastjson demo

fastjson自定义反序列化实现类,demo对一个字符串进行日期格式化(可兼容多重格式)、String转Double和String转Integer。

1.自定义fastjson字符串日期格式化

自定义类DateCompatibilityFormat,继承ObjectDeserializer,如下:
	/**
	 * fastjson custom class
	 * chenyouhong
	 * date format
	 */
	@Slf4j
	public class DateCompatibilityFormat implements ObjectDeserializer {


		//格式化样式
	    private static final List<String> formatStyles = Lists.newArrayList("yyyy.MM.dd", "yyyy.MM", "yyyy.MM.dd hh:mm:ss");

	    //关键代码
	    @Override
	    public Date deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
	        DateTime dateTime = null;
	        try {
	            for (String formatStyle: formatStyles) {
	                dateTime = this.getDateTime(formatStyle, parser.getLexer().stringVal());
	                if (dateTime != null) break;
	            }
	        } catch (Exception e) {
	            log.info("error {}", e);
	        }

	        return dateTime != null ? dateTime.toDate() : null;
	    }

	    //日期格式化
	    private DateTime getDateTime(String sFormat, String sDate) {
	        DateTime dateTime = null;
	        try {
	            dateTime = DateTimeFormat.forPattern(sFormat).parseDateTime(sDate);
	        } catch (Exception e) {
	            log.info("date format error, format={}, date={}, error={}", sFormat, sDate, e);
	        }

	        return dateTime;
	    }

	    //暂未知道具体作用
	    @Override
	    public int getFastMatchToken() {
	        return 0;
	    }

	}

2.对应Model加上相应的注解即可


	@Data
	public class SysUser implements Serializable {

	    private static final long serialVersionUID = 1L;

	    private String username;

	    private String loginCode;

	    private String password;

	    //日期格式化
	    @JSONField(deserializeUsing = DateCompatibilityFormat.class)
	    private Date createDate;

	    private String mobile;

		//String转Integer
	    @JSONField(deserializeUsing = StringToIntegerFormat.class)
	    private Integer age;

		//String转Double
	    @JSONField(deserializeUsing = StringToDoubleFormat.class)
	    private Double weight;

	}

3.测试方法,测试类DemoApplicationTests

	@Test
	public void testFormat() {
		String json = " {\"createDate\":\"2015.03\", \"age\":\"20,189.89\"}";
		SysUser sysUser = JSON.parseObject(json, SysUser.class);

        try {

            DateTime dateTime = new DateTime(sysUser.getCreateDate());
            String s = dateTime.toString("yyyy-MM-dd");
            System.out.println(s);
            s = dateTime.toString("yyyy-MM");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(JSON.toJSONString(sysUser));

	}

同理StringToDoubleFormat、StringToIntegerFormat

4.嵌套对象转map,测试类MapTest

a.嵌套对象转map方法 该方法把嵌套对象转为单层map。

Map<String, Object> map = ObjectToMapUtils.trfMap(json, ".");

b.获取嵌套对象值

该方法不需要转为map,直接配置相关的key,获取对应的value。

//获取对象相应值,key中无数组情况
String condition = "[{\"key\": \"data.page.current\"}]";
List<SearchCondition> conditions = JSON.parseArray(condition, SearchCondition.class);
Object value = ObjectToMapUtils.getObjValue(json, conditions, null);
//输出 1
System.out.println(value);

//获取对象对应value值的数组
condition = "[{\"key\": \"data.rows.name\", \"value\":\"流程步骤名称\"}]";
conditions = JSON.parseArray(condition, SearchCondition.class);
Object obj = ObjectToMapUtils.getObjValue(json, conditions, null);
System.out.println(obj);

代码如下:

    //测试json,可以为一个Object对像
    String json = "{\"success\":0,\"errorMsg\":\"错误消息\",\"data\":{\"total\":\"总记录数\",\"page\":{\"size\":10,\"current\":1},\"rows\":[{\"id\":\"任务ID\",\"workName\":\"任务名称\",\"assigneeName\":\"经办人姓名\",\"name\":\"流程步骤名称\",\"processInstanceInitiatorName\":\"发起人\",\"processInstanceStartTime\":\"发起时间\",\"createTime\":\"到达时间\",\"dueDate\":\"截止时间\"},{\"id\":\"ID\",\"workName\":\"名称\",\"assigneeName\":\"经办人\",\"name\":\"流程\",\"processInstanceInitiatorName\":\"发起人\",\"processInstanceStartTime\":\"发起\",\"createTime\":\"到达\",\"dueDate\":\"截止\"}]}}";

    //转map,connector自定义,表示嵌套对象key与key的连接
    Map<String, Object> map = ObjectToMapUtils.trfMap(json, ".");

    //获取map值
    //输出 {data.page.current=1, data.page.size=10, data={"total":"总记录数","page":{"current":1,"size":10},"rows":[{"assigneeName":"经办人姓名","processInstanceStartTime":"发起时间","createTime":"到达时间","processInstanceInitiatorName":"发起人","dueDate":"截止时间","name":"流程步骤名称","id":"任务ID","workName":"任务名称"},{"assigneeName":"经办人","processInstanceStartTime":"发起","createTime":"到达","processInstanceInitiatorName":"发起人","dueDate":"截止","name":"流程","id":"ID","workName":"名称"}]}, success=0, data.total=总记录数, data.rows=[{"assigneeName":"经办人姓名","processInstanceStartTime":"发起时间","createTime":"到达时间","processInstanceInitiatorName":"发起人","dueDate":"截止时间","name":"流程步骤名称","id":"任务ID","workName":"任务名称"},{"assigneeName":"经办人","processInstanceStartTime":"发起","createTime":"到达","processInstanceInitiatorName":"发起人","dueDate":"截止","name":"流程","id":"ID","workName":"名称"}], errorMsg=错误消息}
    System.out.println(map);
     //输出 10
    System.out.println(map.get("data.page.size"));

    //获取对象相应值,key中无数组情况
    String condition = "[{\"key\": \"data.page.current\"}]";
    List<SearchCondition> conditions = JSON.parseArray(condition, SearchCondition.class);
    Object value = ObjectToMapUtils.getObjValue(json, conditions, null);
     //输出 1
    System.out.println(value);

    //获取对象对应value值的数组
    condition = "[{\"key\": \"data.rows.name\", \"value\":\"流程步骤名称\"}]";
    conditions = JSON.parseArray(condition, SearchCondition.class);
    Object obj = ObjectToMapUtils.getObjValue(json, conditions, null);
    System.out.println(obj);

    //获取对象对应value值的数组
    condition = "[{\"key\": \"data.rows.processInstanceInitiatorName\", \"value\":\"发起人\"}]";
    conditions = JSON.parseArray(condition, SearchCondition.class);
    obj = ObjectToMapUtils.getObjValue(json, conditions, null);
    System.out.println(obj);

    map = ObjectToMapUtils.trfMap(json, "-");
    System.out.println(map);
    System.out.println(map.get("data-page-size"));

About

fastjson demo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages