如何定制对象中特定字段的JSON输出内容

引言: 在Web应用开发中,经常需要将对象转化为JSON字符串的过程中,会有默认的输出内容不符合要求的情况,比如DateTime。一般可以通过定制Serializer来实现定制化的JSON字符输出。

1.  在对象中的getXXX方法中设置自定义的Serializer

public class MyObject {
     private DateTime startDate;
       @JsonSerialize(using = DateTimeJsonSerializer.class)
       public DateTime getStartDate(){
           return this.startDate;
     }
}

说明:

1. @JsonSerializer定义了自定义的序列号类,

2.  using中指定自定义的java转化类

2.  实现自定义的Serializer

public class DateTimeJsonSerializer extends JsonSerializer<DateTime> {

	 private static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH-mm-ss");

	@Override
	public void serialize(DateTime value, JsonGenerator generator,
			SerializerProvider arg2) throws IOException,
			JsonProcessingException {
		 generator.writeString(formatter.print(value));
	}
}

在这个例子中,主要是针对DateTime进行JSON输出类型信息的转换。

DateTime在声明类型的时候,做通用类T来输入;在具体的方法中,做为value来传入。 generator.writeString()来输出JSON String信息。

3.  进行测试

在未进行自定义格式化输出之前

在进行格式化输出之后:

4.  总结

有了@JsonSerialize这个神器之后,就可以随心所欲的输出Json结果信息了。

参考文档

1.  http://stackoverflow.com/questions/3269459/how-to-serialize-joda-datetime-with-jackson-json-processer

2.  http://stackoverflow.com/questions/14026081/jackson-automatic-formatting-of-joda-datetime-to-iso-8601-format

时间: 2024-10-07 05:50:35

如何定制对象中特定字段的JSON输出内容的相关文章

使用jni直接访问java对象中的字段

Java类:UserInfo public class UserInfo { static { System.loadLibrary("userinfo"); } // 从JNI中直接访问字段 public String mUserName; public int mUserAge; public long mMoney; public UserInfo() { } public int getUserAge() { return mUserAge; } public native v

数组对象如何根据对象中某个字段分组

场景:做报表图形展示时,接口返回的数据通常为一组数据对象,需要根据code进行分组,将数据分类成几组,用图形描绘出来 措施:代码如下 返回数组对象包括name和data两个字段,data中包括原数组对象中所有字段. function groupByType(arr,param) { var map = {}, dest = []; for(var i = 0; i < arr.length; i++){ var ai = arr[i]; if(ai[param] && !map[ai

因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题

背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧. 升级缓存版本号 我们的正式环境和预发布环境是共用Redis和Mysql.如果修改了DTO且没有加@Json

批量修改数据库中某个字段里面的部分内容(mysql数据库replace的用法)

也就是说在一张表中会有很多内容,如果想要修改某个字段内容里面相同数据的话,比如说公司名称修改了,那么这个字段里面所有出现的公司名称都得修改,如果一条一条修改当然会很麻烦,数据量如果很大,修改起来很不现实,那肯定有类似编辑器里面的替换所有的功能: 更新一个字段里面的部分内容,指的是这个字段里面所有列:比如这个字段第一列里面内容是123asd,第二列是456asdf,想把as换成AS,那么执行下面语句之后会把这两列全都替换了: update 表明 set 字段名=replace(字段名,'替换前内容

快速更改对象中的字段名

问题描述: 有这样一个对象 let params = { id: 123, name: 'WiseWrong', e_mail: '[email protected]', tell: '12345678', } 由于种种原因,需要将其中的字段名  e_mail 修改为 eMail 分析原因: 处理的方案有很多,比如用 for-in 语句遍历,或者 delete 之后再新增字段,但这两种方案都有问题 首先 for-in 遍历效率太低,直接忽略.使用 delete 处理基础类型很有效,但字段的顺序会

js 对象数组 根据对象中某个字段排序

第一种排序方式 var compare = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop]; if (val1 < val2) { return 1; } else if (val1 > val2) { return -1; } else { return 0; } } }; $scope.orderDrugMasterList.sort(compare(

Java获取类或对象中的字段名称和JsonProperty注释的名称

创建一个模型如下: package model; import com.fasterxml.jackson.annotation.JsonProperty; public class ProvNode { @JsonProperty("machineId") private String nodeId; private String name; private String result; private String status; @JsonProperty("messa

JAVA实现File类中的遍历操作并输出内容

package shb.java.testIo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.Writer; import java.util.HashMap; /** * File类操作(此代码效率不是很高———>输出格式有欠缺.功能还是

java 利用反射修改对象中的list类型字段中的值。

这两天没事学习下了反射.通过反射我们可以修改对象中的字段的值. 就如下面这段代码 Grade grade=new Grade(); Field f=Grade.class.getDeclaredField("name"); f.setAccessible(true); f.set(grade, "三年级一班"); 这是so easy的,这时我想到了要是list类型的字段该怎么通过反射修改呢. 于是我就尝试了下,最终做了出来. 先准备两个类. public class