javascript
json 序列化 java_Java JSON序列化杂谈
在C#中序列化是比較容易的,如果不用第三方的類庫,那么C#提供的兩個對象也夠我們使用,一般的操作是定義一個不含有方法的類,這個類里面定義了要序列化的對象的屬性,因為我C#用的比較多,這里直接給出泛型,第一個是我寫的,第二個是Copy的:
public string ScriptSerialize(T t)
{
JavaScriptSerializer js = new JavaScriptSerializer();
return js.Serialize(t);
}
public T ScriptDeserialize(string strJson)
{
JavaScriptSerializer js = new JavaScriptSerializer();
return js.Deserialize(strJson);
}
}
using System;
using System.Collections.Generic;
using System.Web;
using System.Runtime.Serialization.Json;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace JsonHelper
{
public class JsonClass
{
///
/// Json序列化
///
/// 對象類型
/// 序列化對象
///
public static string JsonSerializer(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
return jsonString;
}
///
/// Json反序列化
///
/// 對象類型
/// 反序列化json字符串
///
public static T JsonDeserialize(string jsonString)
{
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
private static string ConvertJsonDateToDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
}
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
return result;
}
}
}
因為沒怎么用過Java,考慮到http(
請求后數(shù)據(jù)格式的處理,必須解析請求之后的json格式,按照思路,網(wǎng)上找一個json的jar包,然后解析,因為不熟悉,所以碰壁,對這個jar包也不了解,在網(wǎng)上看了下用法,自己也摸索了下,可以采取兩種方式
采用javabean的方式定義對象,這其實就是要將JSON的結構了解清楚,然后按照結構去定義,這里我給出示例(這個示例是為了說明,不是按照上面的http請求結果組成的):
String json="{\"list\":[{\"bookName\":\"數(shù)學\",\"sType\":\"理科\"},{\"bookName\":\"物理\",\"sType\":\"理科\"}],\"person\":{\"age\":10,\"name\":\"劉宇\"}}";
PersonBooks pBooks = new PersonBooks();
List list=new ArrayList();
Book b1 = new Book();
b1.setBookName("數(shù)學");
b1.setsType("理科");
Book b2 = new Book();
b2.setBookName("物理");
b2.setsType("理科");
list.add(b1);
list.add(b2);
Map map = new HashMap();
Person p1 = new Person();
p1.setAge(10);
p1.setName("劉宇");
pBooks.setPerson(p1);
pBooks.setList(list);
JSONObject jsonPersonBooks=JSONObject.fromObject(json);
PersonBooks pPersonBooks=(PersonBooks)JSONObject.toBean(jsonPersonBooks, PersonBooks.class);
System.out.println(pPersonBooks.getPerson().getAge());
System.out.println(pPersonBooks.getPerson().getName());
下面是三個類的定義
public class Book {
String sType;
String BookName;
public String getsType() {
return sType;
}
public void setsType(String sType) {
this.sType = sType;
}
public String getBookName() {
return BookName;
}
public void setBookName(String bookName) {
BookName = bookName;
}
}
public class Person {
String Name;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonBooks {
private List list = null;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
private Person person=null;
}
JSONObject jsonobject = JSONObject.fromObject(sb.toString());
JSONArray jarr=JSONArray.fromObject(jsonobject.get("statuses"));
for(Object jeach : jarr)在這里一個個的解析,可以構造一個bean對象解析,和C#類比,舉一反三
{
JSONObject jo=(JSONObject)jeach;
JSONObject geo=JSONObject.fromObject( jo.get("geo"));
JSONArray jCoord=JSONArray.fromObject(geo.get("coordinates"));
//"geo":{"type":"Point","coordinates":[39.90813,116.30328]}
Iterator iter = jCoord.iterator();
System.out.println("打印坐標:");
while(iter.hasNext()){
String str = iter.next().toString();
System.out.println(str);
}
其實就像我在以前的日志中說的一樣,世間萬事萬物都具有相似性,就好比C#和Java,一定要學會這種靈活運用的思維,舉一反三,在一個新的東西中看到一些方法名,屬性名,就應該才猜到是干什么的,同時要學會聯(lián)想,結合已經有的知識去判斷,比如tag,比如label這樣的東西,要不然在兩個相似的東西上面花費重復的時間,太不值得了!
一個東西的實現(xiàn)可能有多種實現(xiàn)手段,但是其本質,其原理都是一樣的,學東西,不僅僅要知道如何去做,更應該了解為什么這樣,雖然后者我們可能都不清楚,但是也起碼應該知道其處理流程,只要思路正確,那就是如何去實現(xiàn)的問題,看來還需要牢記!
上面介紹的是json的序列化,如果是XML的序列化呢?類比可以知道,也可以通過定義類,然后采用C#提供的XML序列化的方法,不知道是否有興趣嘗試下呢?
總結
以上是生活随笔為你收集整理的json 序列化 java_Java JSON序列化杂谈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kkr是什么公司
- 下一篇: java arraylist线程安全_A