上一篇写的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(); }
相关推荐
在前端开发中,有时我们需要处理来自用户上传的Excel文件数据,并将其转化为JSON对象以便进一步处理或与后端交互。这个过程通常涉及到文件读取、数据解析以及格式转换。以下是一些关于如何使用JavaScript实现这一...
Java Bean转换为Json Schema是一种常见的数据转换操作,特别是在开发基于RESTful API的Web服务时,因为JSON ...理解Json Schema的结构和使用合适的库,可以有效地实现这一转换,并为项目的稳定性和可维护性打下基础。
- **Java中的JSON转换**:在Java中,我们可以使用如Jackson、Gson、Fastjson等库将Java对象转换为JSON字符串。例如,Jackson库的`ObjectMapper`类提供了`writeValueAsString()`方法,可以将Java对象转换为JSON字符...
本话题将深入探讨如何将一个`DataTable`对象转化为Json数据,这是在Web应用开发中尤为常见的需求,因为Json是一种轻量级、易于人读和机器解析的数据交换格式。在.NET框架下,我们可以利用内置的类和方法来完成这个...
当我们需要将JavaScript对象发送到服务器或者存储在本地时,通常会使用`JSON.stringify()`方法将对象转换为JSON字符串。下面我们将详细探讨几种常见的将前端对象转换为JSON并使用`JSON.stringify()`的方法。 1. **...
在这个例子中,`ObjectListToJSON`类就是利用反射来获取`List<object>`中每个对象的属性和其对应的值,并将它们转化为JSON格式。 `GetObjectProperty`方法遍历给定对象的所有属性,通过`PropertyInfo`类获取每个...
对于后端开发者而言,能够高效、便捷地将 JSON 数据转换为 Java 对象是一项必备技能。这不仅提高了开发效率,也增强了代码的可读性和维护性。 #### 二、理论基础:JSON 与 Java 对象的关系 **1. JSON简介** JSON ...
例如,如果你有一个JSON字符串`'{"name": "John", "age": 30}'`,`JSON.parse()`可以将其转换为一个JavaScript对象`{name: "John", age: 30}`。这样,你就可以通过`.name`或`.age`来访问这些属性。 2. `JSON....
在XML到JSON转换过程中,XStream可能首先用于将XML数据转换为Java对象,然后这些对象再由Json-lib处理成JSON格式。 XML到JSON的转换通常包括以下步骤: - 解析XML文档,将其转换为DOM(Document Object Model)树。...
json-lib库提供了一种便捷的方式来进行这种转换,但根据具体需求,开发者还需要根据性能、内存效率和数据复杂性来选择合适的方法。在实际开发中,确保正确处理XML中的命名空间、属性、注释和处理指令等特殊元素也是...
本主题以Java为例,探讨如何使用第三方库将JavaBean对象、List、Set或Map对象转换为JSON格式。 1. **JavaBean对象转JSON** JavaBean是一种遵循特定规范的Java类,通常用于封装数据。将JavaBean对象转为JSON时,...
json-lib库支持将Java中的多种对象转换为JSON,包括JavaBeans、Map、Collection以及数组等。它同样支持将JSON格式的字符串或JSON对象转换回Java对象。该库依赖于一些其他开源库来提供其功能,包括commons-lang、...
JSON-lib 提供了将Java对象转换为JSON字符串以及将JSON字符串反序列化为Java对象的方法。 1. **List转换** 在Java代码示例中,可以看到如何将不同类型的列表转换为JSON数组。`JSONArray.fromObject()`方法被用来...
当我们将Java对象转换为JSON格式时,有时我们可能需要忽略某些特定属性,特别是子对象的特定属性。本文将详细讲解如何使用Jackson来实现这一功能。 首先,Jackson提供了一个`@JsonIgnoreProperties`注解,用于忽略...
例如,将Java对象转换为JSON字符串: ```java ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(yourObject); ``` 反向转换,将JSON字符串解析为Java对象: ```...
当你有了一个`User`实例,你可以很容易地将它转化为JSON字符串,反之亦然。 对于数组,ObjectMapper也提供了很好的支持。如果你的JSON数据包含一个数组,你可以定义一个数组类型,如`[User]`,并使用`ArrayMapping`...
在Java编程中,将JSON对象转换为Java Bean对象是一个常见的任务,特别是在处理Web服务或API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而Java Bean是符合特定规范的Java类,通常用于...
JSON串转换映射成Java对象是Java开发中的基础技能,涉及了JSON库的选择、数据类型匹配、嵌套结构处理等多个方面。熟悉并掌握这些工具和技巧,能够帮助开发者更高效地进行数据处理,提高开发效率。对于进阶开发者,...
- JavaScript内置的`JSON.stringify()`方法可以将JSON对象转换为字符串,例如: ```javascript var jsonString = JSON.stringify(jsonObject); ``` 6. 常见问题与注意事项 - XML中的命名空间(namespaces)在...
- 手动序列化:如果需要更精细的控制,可以编写一个函数,遍历对象的所有属性,手动将它们转换为JSON字典或字符串。 3. **函数式编程的应用**: - 使用高阶函数:Swift的`map`、`flatMap`和`reduce`等高阶函数...