使用JSONObject 深度序列化和反序列化

2021-09-07 11:32:43 字數 2868 閱讀 6692

jsonobject 和jsonarray 是json-lib.jar裡面最經常使用的兩個類,分別能夠對物件和陣列(集合)進行序列化和反序列化,結構清晰命了,簡單易用,功能強大,效率比較高,使用至今一直較為推崇,儘管尚有諸多功能尚未全然了解,姑且邊學邊記,以作歸納、沉澱。

首先看兩個類:

student類:

public class student 

public void setname(string name)

public string getgerder()

public void setgerder(string gerder)

public string getaddress()

public void setaddress(string address)

}

classes類:

public class classes 

public void setstudent(student student)

public string getclsnum()

public void setclsnum(string clsnum)

public string getclaname()

public void setclaname(string claname)

public string getway()

public void setway(string way)

public listgetstudents()

public void setstudents(liststudents)

}

值得注意的是:classes類中。既包括student物件,也包括list這種集合,這是為了讓我麼接下來的操作更有深度些:

測試類:mytest

public class mytest }
這時我們的cs物件已經封裝好了,接下來進行序列化:

system.out.println(jsonobject.fromobject(cs).tostring());

結果:,"students":,"way":"wentaoyuan1"}

看以看到序列化是深度沒有問題。全部的字段包含巢狀(姑且這麼叫)的物件的字段也都完好了。看以稱之為「徹底的序列化」。

接下來看一下反序列化:

jsonobject jo = jsonobject.fromobject(",'students':,'way':'wentaoyuan1'}");

classes cls = (classes) jsonobject.tobean(jo, classes.class);

system.out.println(cls.getclsnum() + "==" + cls.getstudent().getaddress());

結果:123==guangzhou

也沒有問題。

注:當巢狀的物件較多時。看以寫乙個class map來註明反序列化的各個類路徑,如:

map>> clazz = new hashmap>>(); clazz.put("student", student.class); clazz.put("students", student.class);

能夠使用tobean的過載方法設定clazz也能夠通過jsonconfig的setclassmap(clazz);來設定

假設我有這麼乙個需求。在物件cs的基礎上我要把jo的資料封裝給它。這時候就要用到tobean的還有乙個過載方法:

map> clazz = new hashmap>>(); clazz.put("student", student.class); clazz.put("students", student.class); jsonobject jo = jsonobject.fromobject(",'students':,'way':'wentaoyuan1'}"); jsonconfig jc = new jsonconfig(); jc.setclassmap(clazz); classes cls = (classes) jsonobject.tobean(jo, cs, jc);

這時候有個問題了,當jo中的屬性clsnum不存在的時候。會出現什麼問題呢?

實驗證明。當某個屬性不存在的時候,該屬性的值不被覆蓋,等於cs原有的值。

當jo中student中的屬性,address不存在的時候,會不會也是上面的那個情況呢?

jsonobject jo = jsonobject

.fromobject(",'students':,'way':'wentaoyuan1'}");

jsonconfig jc = new jsonconfig();

jc.setclassmap(clazz);

classes cls = (classes) jsonobject.tobean(jo, cs, jc);

system.out.println(cls.getclsnum() + "==" + cls.getstudent().getaddress());

列印結果:

123==null

結論:深層次的物件假設不存在某個屬性。則會被覆蓋掉。

那麼能不能讓它跟一級屬性一樣,不進行覆蓋呢?我認為應該是能夠實現的,這個問題當然要著落在jsonconfig上,上面有非常多設定。大多數我還沒有看明確,因此臨時不知道怎麼辦?但假設這個功能是由我來設計,我一定會設定這麼乙個開關,預設覆蓋深層次的屬性,當然能夠調整回來。

請各位網友給與賜教。怎樣來解決問題?

其它關於json-lib的文章,將在接下來的博文中陸續呈現。

Unity 使用JSONObject解析Json

之前已經用過jsonutility和newton.json來解析json了,為什麼現在又要用乙個新的jsonobject來解析json?在unity遊戲開發中,使用newton.json來反序列化時,需要指定確定的型別,這會帶來什麼問題?在遊戲的道具系統中,有乙個父類item類,包含屬性id和nam...

JsonObject生成Json字串有轉意字元

patientinfo height weight 身高170 age 1,patientid 如上圖 name 利用org.json.jsonobject生成json字串有轉意字元 原因是 換成 private static jsonobject getobjectname name name c...

在JAVA中使用JSONObject生成json

json是一種輕量級的資料交換格式,在現在的web開發中,是非常常見的。在沒有方便的工具之前,我們或許會使用拼字串的形式來生成json陣列,今天我們使用乙個json lib.jar包來為我們實現生成json的功能。所必須的包有 1 bean轉為json user u new user u.setag...