`
zhanshi258
  • 浏览: 48093 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

选择性将对象的属性转换为Json

    博客分类:
  • Java
 
阅读更多

上一篇写的Json转换项目中大部分情况都已经够用了,但是,有时候一个对象很多属性,而我们并不需要那么多,那么就选择性的过滤掉一些属性喽。

还有对于日期这样的属性,我们该让它以何种格式显示呢? 这也是我们需要考虑的问题。

下面请看实例:

实体类Student.java 

 

public class Student {

	@Include("tt")
	private String userName;
	
	@Exclude("tt")
	private int age;
	
	@Include("tt")
	private Date birthDay;
	
	private List<String> hobbiy;
	
	/////////////////get/set方法已经省略/////////////////////////
}

 

 

我们采用注解的方式,在实体类上加上一个注解,加了注解的表示要转换成Json的,没加的则不转换,而且可以灵活的控制。

 

注解类:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Include {
	String[] value() default "";
}

 

转换类:

public class JsonInclude {
	private static Map<String,List<String>> classfields=new HashMap<String,List<String>>();
	private JsonInclude() {
	}
/**
 * 
 * @param obj
 * @param includeTag 只将Include标签中包含此字符串的field转换成json 为null时将不过滤
 * @return
 */
	public static Object json(Object obj, String includeTag) {
		try {
			if (null != obj) {
				JsonConfig jsonConfig=null;
				if(StringUtils.isEmpty(includeTag))
					jsonConfig=getJsonConfig();
				else
					jsonConfig=getJsonConfig(includeTag);
				jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());  
				if (obj instanceof List ) {
					return JSONArray.fromObject(obj, jsonConfig);
				} else {
					return JSONObject.fromObject(obj, jsonConfig);
				}
			}
			return obj;
		} catch (Exception e) {
			System.out.println("json failed " + includeTag);
			System.out.println(e.getLocalizedMessage());
			System.out.println(e);
		}
		return obj;
	}

	private static JsonConfig getJsonConfig(final String includeTag) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	if(value == null){
            		return true;
            	}else{
        			Class<?> objClass=obj.getClass();
        			Class<?> tempClass=obj.getClass();
        			List<String> fields=classfields.get(objClass.getName()+includeTag);
        			if(CollectionUtils.isEmpty(fields)){
        				fields=new ArrayList<String>();
        				while(objClass!=null){
            				Field[] fieldss=objClass.getDeclaredFields();
            				for(Field f:fieldss){
            					if(f.isAnnotationPresent(Include.class)){
            						String[] tag = f.getAnnotation(Include.class).value();
            						for (String str : tag) {
            							if (str.equals(includeTag)) {
            								fields.add(f.getName());
            								break;
            							}
            						}
            					}
            				}
            				objClass=objClass.getSuperclass();
            			}
        				classfields.put(tempClass.getName()+includeTag, fields);
        			}
    				for(String ff:fields){
    					if(ff.equals(name)){
    						return false;
    					}
    				}
        			return true;
            	}
            }
        });
		return jsonConfig;
	}
	private static JsonConfig getJsonConfig() {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	return null==value;
            }
        });
		return jsonConfig;
	}
}

 

这里面用到了日期格式转换的类,等最后面会贴出来。

现在就可以看测试类了:

public class IncludeTest {

	//所有属性都会转换
	public void objectNoTag(){
		Student s = new Student();
		s.setAge(45);
		s.setBirthDay(new Date());
		List<String> hobbiy = new ArrayList<String>();
		hobbiy.add("唱歌");hobbiy.add("跳舞");hobbiy.add("爬山");
		s.setHobbiy(hobbiy);
		s.setUserName("张三");
		
		System.out.println(JsonInclude.json(s, null));
	}
	
	//现在只有属性上加有@Include("tt")注解的才会转换了
	public void objectTag(){
		Student s = new Student();
		s.setAge(45);
		s.setBirthDay(new Date());
		List<String> hobbiy = new ArrayList<String>();
		hobbiy.add("唱歌");hobbiy.add("跳舞");hobbiy.add("爬山");
		s.setHobbiy(hobbiy);
		s.setUserName("张三");
		
		System.out.println(JsonInclude.json(s, "tt"));
	}
	
	public static void main(String[] args) {
		IncludeTest inc = new IncludeTest();
		inc.objectNoTag();
		inc.objectTag();
	}
	

 

日期转换类:

public class JsonDateValueProcessor implements JsonValueProcessor {
	
	public JsonDateValueProcessor() {
		super();
	}
	
	public JsonDateValueProcessor(String format) {
		super();
	}

	@Override
	public Object processArrayValue(Object paramObject,
			JsonConfig paramJsonConfig) {
		return process(paramObject);
	}

	@Override
	public Object processObjectValue(String paramString, Object paramObject,
			JsonConfig paramJsonConfig) {
		return process(paramObject);
	}
	
	
	private Object process(Object value){
        if(value instanceof Date){  
            return ((Date) value).getTime();
        }  
        return value == null ? "" : value.toString();  
    }

}

 

可能会有人觉得如果我只想去掉某一个属性,那你不会让我把剩下的属性全加你那个注解吧? 当然不会。

我们可以再写一个嘛

注解类:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Exclude {
	String[] value() default "";
}

 

转换类:

public class JsonExclude {
	
	private static Map<String,List<String>> classfields=new HashMap<String,List<String>>();
	private JsonExclude() {}
	
	/**
	 * 
	 * @param obj
	 * @param excludeTag 将过滤Exclude标签中包含此字符串的field的属 ?为null时将不过滤
	 * @return
	 */
	public static Object json(Object obj, String excludeTag) {
		try {
			if (null != obj) {
				JsonConfig jsonConfig=null;
				if(StringUtils.isEmpty(excludeTag))
					jsonConfig=getJsonConfig();
				else
					jsonConfig=getJsonConfig(excludeTag);
				jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
				if (obj instanceof List) {
					return JSONArray.fromObject(obj, jsonConfig);
				} else {
					return JSONObject.fromObject(obj, jsonConfig);
				}
			}
			return obj;
		} catch (Exception e) {
			System.out.println("json failed . excludeTag={},msg={}" + excludeTag + e.getLocalizedMessage() + e);
		}
		return obj;
	}

	private static JsonConfig getJsonConfig(final String excludeTag) {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	if(value == null){
            		return true;
            	}else{
        			Class<?> objClass=obj.getClass();
        			Class<?> tempClass=obj.getClass();
        			List<String> fields=classfields.get(objClass.getName()+excludeTag);
        			if(CollectionUtils.isEmpty(fields)){
        				fields=new ArrayList<String>();
        				while(objClass!=null){
            				Field[] fieldss=objClass.getDeclaredFields();
            				for(Field f:fieldss){
            					if(f.isAnnotationPresent(Exclude.class)){
            						String[] tag = f.getAnnotation(Exclude.class).value();
            						for (String str : tag) {
            							if (str.equals(excludeTag)) {
            								fields.add(f.getName());
            								break;
            							}
            						}
            					}
            				}
            				objClass=objClass.getSuperclass();
            			}
        				classfields.put(tempClass.getName()+excludeTag, fields);
        			}
    				for(String ff:fields){
    					if(ff.equals(name)){
    						return true;
    					}
    				}
        			return false;
            	}
            }
        });
		return jsonConfig;
	}
	private static JsonConfig getJsonConfig() {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setJsonPropertyFilter(new PropertyFilter(){
            @Override
            public boolean apply(Object obj, String name, Object value) {
            	return null==value;
            }
        });
		return jsonConfig;
	}
}

 

测试:

public class ExcludeTest {

	public void listTag(){
		Student s0 = new Student();
		s0.setAge(45);
		s0.setBirthDay(new Date());
		List<String> hobbiy0 = new ArrayList<String>();
		hobbiy0.add("唱歌");hobbiy0.add("跳舞");hobbiy0.add("爬山");
		s0.setHobbiy(hobbiy0);
		s0.setUserName("张三");
		
		Student s1 = new Student();
		s1.setAge(35);
		s1.setBirthDay(new Date());
		List<String> hobbiy1 = new ArrayList<String>();
		hobbiy1.add("唱歌1");hobbiy1.add("跳舞1");hobbiy1.add("爬山1");
		s1.setHobbiy(hobbiy1);
		s1.setUserName("李四");
		
		Student s2 = new Student();
		s2.setAge(25);
		s2.setBirthDay(new Date());
		List<String> hobbiy2 = new ArrayList<String>();
		hobbiy2.add("唱歌2");hobbiy2.add("跳舞2");hobbiy2.add("爬山2");
		s2.setHobbiy(hobbiy2);
		s2.setUserName("王五");
		List<Student> list = new ArrayList<Student>();
		
		list.add(s0);list.add(s1);list.add(s2);
		
		System.out.println(JsonExclude.json(list, "tt"));
	}
	
	
	public static void main(String[] args) {
		ExcludeTest exc = new ExcludeTest();
		exc.listTag();
	}

 

分享到:
评论

相关推荐

    js将excel转化成json 对象

    在前端开发中,有时我们需要处理来自用户上传的Excel文件数据,并将其转化为JSON对象以便进一步处理或与后端交互。这个过程通常涉及到文件读取、数据解析以及格式转换。以下是一些关于如何使用JavaScript实现这一...

    Java bean转换为Json Schema

    Java Bean转换为Json Schema是一种常见的数据转换操作,特别是在开发基于RESTful API的Web服务时,因为JSON ...理解Json Schema的结构和使用合适的库,可以有效地实现这一转换,并为项目的稳定性和可维护性打下基础。

    对象转换成JSON和Map

    - **Java中的JSON转换**:在Java中,我们可以使用如Jackson、Gson、Fastjson等库将Java对象转换为JSON字符串。例如,Jackson库的`ObjectMapper`类提供了`writeValueAsString()`方法,可以将Java对象转换为JSON字符...

    数据表转化为Json数据代码实现

    本话题将深入探讨如何将一个`DataTable`对象转化为Json数据,这是在Web应用开发中尤为常见的需求,因为Json是一种轻量级、易于人读和机器解析的数据交换格式。在.NET框架下,我们可以利用内置的类和方法来完成这个...

    这几种方式将前端的 对象转换成json ,再用 Json.stringify(list)

    当我们需要将JavaScript对象发送到服务器或者存储在本地时,通常会使用`JSON.stringify()`方法将对象转换为JSON字符串。下面我们将详细探讨几种常见的将前端对象转换为JSON并使用`JSON.stringify()`的方法。 1. **...

    将List对象列表转换成JSON格式的类.pdf

    在这个例子中,`ObjectListToJSON`类就是利用反射来获取`List&lt;object&gt;`中每个对象的属性和其对应的值,并将它们转化为JSON格式。 `GetObjectProperty`方法遍历给定对象的所有属性,通过`PropertyInfo`类获取每个...

    JSON 转化为java对象

    对于后端开发者而言,能够高效、便捷地将 JSON 数据转换为 Java 对象是一项必备技能。这不仅提高了开发效率,也增强了代码的可读性和维护性。 #### 二、理论基础:JSON 与 Java 对象的关系 **1. JSON简介** JSON ...

    json2.js 字符串转转json对象工具

    例如,如果你有一个JSON字符串`'{"name": "John", "age": 30}'`,`JSON.parse()`可以将其转换为一个JavaScript对象`{name: "John", age: 30}`。这样,你就可以通过`.name`或`.age`来访问这些属性。 2. `JSON....

    xml & json 转换工具

    在XML到JSON转换过程中,XStream可能首先用于将XML数据转换为Java对象,然后这些对象再由Json-lib处理成JSON格式。 XML到JSON的转换通常包括以下步骤: - 解析XML文档,将其转换为DOM(Document Object Model)树。...

    XML转换为JSON(支持多种方法)

    json-lib库提供了一种便捷的方式来进行这种转换,但根据具体需求,开发者还需要根据性能、内存效率和数据复杂性来选择合适的方法。在实际开发中,确保正确处理XML中的命名空间、属性、注释和处理指令等特殊元素也是...

    使用第三方工具将各种对象转成json格式

    本主题以Java为例,探讨如何使用第三方库将JavaBean对象、List、Set或Map对象转换为JSON格式。 1. **JavaBean对象转JSON** JavaBean是一种遵循特定规范的Java类,通常用于封装数据。将JavaBean对象转为JSON时,...

    java 和 json 对象间转换

    json-lib库支持将Java中的多种对象转换为JSON,包括JavaBeans、Map、Collection以及数组等。它同样支持将JSON格式的字符串或JSON对象转换回Java对象。该库依赖于一些其他开源库来提供其功能,包括commons-lang、...

    java对象与json对象的转换

    JSON-lib 提供了将Java对象转换为JSON字符串以及将JSON字符串反序列化为Java对象的方法。 1. **List转换** 在Java代码示例中,可以看到如何将不同类型的列表转换为JSON数组。`JSONArray.fromObject()`方法被用来...

    java jackson 将对象转json时,忽略子对象的某个属性操作

    当我们将Java对象转换为JSON格式时,有时我们可能需要忽略某些特定属性,特别是子对象的特定属性。本文将详细讲解如何使用Jackson来实现这一功能。 首先,Jackson提供了一个`@JsonIgnoreProperties`注解,用于忽略...

    java 对象与json字符串互相转换工具类

    例如,将Java对象转换为JSON字符串: ```java ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(yourObject); ``` 反向转换,将JSON字符串解析为Java对象: ```...

    swift-ObjectMapper是一个用Swift编写的框架可以轻松地将模型对象转换为JSON和从JSON转换

    当你有了一个`User`实例,你可以很容易地将它转化为JSON字符串,反之亦然。 对于数组,ObjectMapper也提供了很好的支持。如果你的JSON数据包含一个数组,你可以定义一个数组类型,如`[User]`,并使用`ArrayMapping`...

    拷贝JSON对象值进Java Bean对象

    在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...

    JSON串转换映射成java对象

    JSON串转换映射成Java对象是Java开发中的基础技能,涉及了JSON库的选择、数据类型匹配、嵌套结构处理等多个方面。熟悉并掌握这些工具和技巧,能够帮助开发者更高效地进行数据处理,提高开发效率。对于进阶开发者,...

    xml转换位JSON对象

    - JavaScript内置的`JSON.stringify()`方法可以将JSON对象转换为字符串,例如: ```javascript var jsonString = JSON.stringify(jsonObject); ``` 6. 常见问题与注意事项 - XML中的命名空间(namespaces)在...

    swift-函数式的JSON解析映射到对象对象序列化为JSON

    - 手动序列化:如果需要更精细的控制,可以编写一个函数,遍历对象的所有属性,手动将它们转换为JSON字典或字符串。 3. **函数式编程的应用**: - 使用高阶函数:Swift的`map`、`flatMap`和`reduce`等高阶函数...

Global site tag (gtag.js) - Google Analytics