json-lib反序列化抽象属性及对象

使用json默认反序列化接口反序列化对象时,对象的类型必须的确定的,比如不能是抽象类型,否则会报无法实例化对象的异常

如有下列类定义:

 1 public abstract class AbstracObj {
 2
 3     private String propCommmon;
 4
 5     public String getPropCommmon() {
 6         return propCommmon;
 7     }
 8
 9     public void setPropCommmon(String propCommmon) {
10         this.propCommmon = propCommmon;
11     }
12
13 }

AbstracObj

 1 public class ObjectA extends AbstracObj{
 2
 3     private String propA;
 4
 5     public String getPropA() {
 6         return propA;
 7     }
 8
 9     public void setPropA(String propA) {
10         this.propA = propA;
11     }
12
13 }

ObjectA

 1 public class ObjectB extends AbstracObj{
 2
 3     private String propB;
 4
 5     public String getPropB() {
 6         return propB;
 7     }
 8
 9     public void setPropB(String propB) {
10         this.propB = propB;
11     }
12
13 }

ObjectB

 1 import net.sf.json.JSONObject;
 2
 3 public class TestJsonObj {
 4
 5     private String jsonProp;
 6
 7     private AbstracObj absProp;
 8
 9     public String getJsonProp() {
10         return jsonProp;
11     }
12
13     public void setJsonProp(String jsonProp) {
14         this.jsonProp = jsonProp;
15     }
16
17     public AbstracObj getAbsProp() {
18         return absProp;
19     }
20
21     public void setAbsProp(AbstracObj absProp) {
22         this.absProp = absProp;
23     }
24
25     public static void main(String[] args) {
26         TestJsonObj tb = new TestJsonObj();
27         tb.setJsonProp("aaaa");
28         ObjectA oa = new ObjectA();
29         oa.setPropCommmon("common");
30         oa.setPropA("propA");
31         tb.setAbsProp(oa);
32         JSONObject jsonObject = JSONObject.fromObject(tb);
33         jsonObject.toBean(jsonObject, TestJsonObj.class);
34     }
35 }

TestJsonObj

TestJsonObj无法反序列化,因为它有一个抽象属性absProp。

可以通过增加标志抽象对象的类型属性及重载json-lib反序列化的接口实现。

定义接口Jsonable,让对象实现这个接口:

 1 public class ObjectA extends AbstracObj implements Jsonable {
 2
 3     private String propA;
 4
 5     public String getPropA() {
 6         return propA;
 7     }
 8
 9     public void setPropA(String propA) {
10         this.propA = propA;
11     }
12
13     @Override
14     public Class<?> getClazz() {
15         return ObjectA.class;
16     }
17
18 }

ObjectA

 1 public class ObjectB extends AbstracObj implements Jsonable {
 2
 3     private String propB;
 4
 5     public String getPropB() {
 6         return propB;
 7     }
 8
 9     public void setPropB(String propB) {
10         this.propB = propB;
11     }
12
13     @Override
14     public Class<?> getClazz() {
15         return ObjectB.class;
16     }
17
18 }

ObjectB

 1 import java.lang.reflect.InvocationTargetException;
 2 import java.lang.reflect.Modifier;
 3
 4 import net.sf.json.JSONObject;
 5 import net.sf.json.JsonConfig;
 6 import net.sf.json.util.NewBeanInstanceStrategy;
 7
 8 public class TestJsonObj {
 9
10     private String jsonProp;
11
12     private AbstracObj absProp;
13
14     public String getJsonProp() {
15         return jsonProp;
16     }
17
18     public void setJsonProp(String jsonProp) {
19         this.jsonProp = jsonProp;
20     }
21
22     public AbstracObj getAbsProp() {
23         return absProp;
24     }
25
26     public void setAbsProp(AbstracObj absProp) {
27         this.absProp = absProp;
28     }
29
30     private static JsonConfig unserializableConfig = new JsonConfig();
31
32     static {
33         // 设置类初始化策略,过滤抽象类
34         unserializableConfig.setNewBeanInstanceStrategy(new NewBeanInstanceStrategy() {
35
36             @Override
37             public Object newInstance(Class c, JSONObject jo) throws InstantiationException, IllegalAccessException,
38                     SecurityException, NoSuchMethodException, InvocationTargetException {
39                 // 是否为抽象类
40                 if (Modifier.isAbstract(c.getModifiers())) {
41                     try {
42                         // 返回类
43                         return Class.forName(jo.getString("clazz")).newInstance();
44                     }
45                     catch (Exception e) {
46                         e.printStackTrace();
47                     }
48                 }
49                 return c.newInstance();
50             }
51         });
52     }
53
54     /**
55      * 将json字符串反序列化成对象.</p>
56      *
57      * 如果传下来classType的值,则反序列了classType,如果没有传,则json串中必须含有clazz属性,指定json串要反序列化的类型。
58      *
59      * @param json
60      *            json字符串
61      * @return 返回对象
62      */
63     public static Object toObject(String json, Class<?> classType) throws Exception {
64         JSONObject jsonObject = JSONObject.fromObject(json);
65         Class<?> clazz = classType;
66         if (classType != null) {
67             clazz = classType;
68         }
69         else {
70             String clazzName = jsonObject.getString("clazz");
71             clazz = Class.forName(clazzName);
72         }
73         JsonConfig jsonConfig = unserializableConfig.copy();
74         jsonConfig.setRootClass(clazz);
75         return JSONObject.toBean(jsonObject, jsonConfig);
76     }
77
78     public static void main(String[] args) {
79         TestJsonObj tb = new TestJsonObj();
80         tb.setJsonProp("aaaa");
81         ObjectA oa = new ObjectA();
82         oa.setPropCommmon("common");
83         oa.setPropA("propA");
84         tb.setAbsProp(oa);
85         JSONObject jsonObject = JSONObject.fromObject(tb);
86         System.out.println(jsonObject.toString());
87         try {
88             System.out.println(toObject(jsonObject.toString(), TestJsonObj.class));
89         }
90         catch (Exception e) {
91             e.printStackTrace();
92         }
93     }
94
95 }

TestJsonObj

ObjectA和ObjectB实现getClazz接口,返回了自己的Class类型。

这时将TestJsonObj序列化后看到absProp增加了clazz属性:

{
    "absProp": {
        "clazz": "ObjectA",
        "propA": "propA",
        "propCommmon": "common"
    },
    "jsonProp": "aaaa"
}

Json串

反序列化时实例化clazz类型就可以了,见JsonConfig的配置。

时间: 2024-08-08 19:40:29

json-lib反序列化抽象属性及对象的相关文章

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询.目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能. Newtonsoft.Json的地址: 官网:http://json.codeplex.com/ 源码地址:https://gi

Memcached中对象反序列化和json字符串用jackson解析成对象的比较

如果项目已经发布,如果临时想对某个在Memcached中的key修改值,那么以对象形式存储的话,将很难修改,但如果以字符串形式存储,通过json解析成对象的话,则会方便很多,因为通过界面往Memcached 添加字符串值是很简单的. 现在来比较一下这两种方式在时间消耗方面的差异: package bean; import java.io.Serializable; public class User implements Serializable{ /** * 序列号 */ private st

spring mvc接收ajax提交的JSON数据,并反序列化为对象

需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; $.ajax({ url: "/book/adddata", type: "POST", dataType: 'json', //必需设定,后台@RequestBody会根据它做数据反序列化 contentType:"application/json&quo

C# Newtonsoft.Json JObject移除属性,在序列化时忽略

原文 C# Newtonsoft.Json JObject移除属性,在序列化时忽略 一.针对 单个 对象移除属性,序列化时忽略处理 JObject实例的 Remove() 方法,可以在 指定序列化时移除属性和值 示例如下 : [csharp] view plain copy //json 序列化 JObject obj1 = JObject.FromObject(new { id = 1, name = "张三", age = 20 }); Console.WriteLine(obj1

常用json序列化/反序列化技术对比测试

目前常用的json工具有:1.json-lib:2.jakson-mapper:3.fastjson. 下面对这三种工具的性能进行简单对比测试. 测试样本:一个126K的json文件,内容为json数组. 测试方法:反序列化,读取文件中的json转化为java对象. 测试代码如下: 1 @Test 2 public void testDeserialize() throws Exception { 3 String dealer = "d:\\auto\\json\\100016109.js&q

struts2,ajax,json传json给Action中的类对象,并返回需要的数据

一.准备 1.json所需jar包:(有时候内容没问题,仔细检查jar包,是不是少了,各种版本杂交....我用的是struts2-2.5.8里jar包,可以成功) commons-lang.jar json-lib-2.3-jdk15.jar struts2-json-plugin-2.2.3.jar ezmorph-1.0.1.jar commons-beanutils-1.9.2.jar commons-collections-3.1.jar 除此之外,stuts2环境不用多说了. 二.内容

[Jackson] 使用ObjectMapper对含有任意key的JSON进行反序列化

使用ObjectMapper对含有任意key的JSON进行反序列化 在调用某个RESTful API后,返回的JSON字符串中含有没有预先定义的key,和结构固定的JSON相比,它需要一些额外的操作. 对于结构固定的JSON,使用ObjectMapper结合某个预先定义的实体类型可以非常方便地完成反序列化工作,比如对下面这样的JSON: GET /person/1 { "id": "1", "name": "dm_vincent&quo

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点的 json 报文 问题 问题描述起来比较拗口,其实就是用Spring MVC时,如何将对象映射成 json 报文时不把对象作为json的根节点.即使用@ResponseBody的效果. 比如,默认情况下,使用ModelAndView的addObject(key,object)或者ModelMap的addAttribute(key,object)保存完Java对象,然后交给Srping的视图解析器解析成json时,

Newtonsoft.Json.dll 反序列化JSON字符串

上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向后台传递JSON数据,并对JSON数据处理,详述见博客< <项目经验>--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中 >),需要对传递的JSON数据反序列化.于是从网上找了许多JSON反序列化的例子,最终决定使用New