Java JSON序列化杂谈

在C#中序列化是比较容易的,如果不用第三方的类库,那么C#提供的两个对象也够我们使用,一般的操作是定义一个不含有方法的类,这个类里面定义了要序列化的对象的属性,因为我C#用的比较多,这里直接给出泛型,第一个是我写的,第二个是Copy的:

 public string ScriptSerialize<T>(T t)
        {

            JavaScriptSerializer js = new JavaScriptSerializer();

            return js.Serialize(t);

        }



        public T ScriptDeserialize<T>(string strJson)
        {

            JavaScriptSerializer js = new JavaScriptSerializer();

            return js.Deserialize<T>(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
    {

        /// <summary>
        /// Json序列化
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="t">序列化对象</param>
        /// <returns></returns>
        public static string JsonSerializer<T>(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();
            string p = @"\\/Date\((\d+)\+\d+\)\\/";

            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);

            Regex reg = new Regex(p);

            jsonString = reg.Replace(jsonString, matchEvaluator);

 

            return jsonString;

        }

        /// <summary>
        /// Json反序列化
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="jsonString">反序列化json字符串</param>
        /// <returns></returns>
        public static T JsonDeserialize<T>(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(

https://api.weibo.com/2/place/nearby_timeline.json?lat=39.91611756877837&long=116.38559999999804&range=11132&access_token=2.00QekzUDNVJpcE9536073d7a8o11IB&page=1&count=50&endtime=1371799367&starttime=1371795767

请求后数据格式的处理,必须解析请求之后的json格式,按照思路,网上找一个json的jar包,然后解析,因为不熟悉,所以碰壁,对这个jar包也不了解,在网上看了下用法,自己也摸索了下,可以采取两种方式

采用javabean的方式定义对象,这其实就是要将JSON的结构了解清楚,然后按照结构去定义,这里我给出示例(这个示例是为了说明,不是按照上面的http请求结果组成的):

 

  String json="{\"list\":[{\"bookName\":\"数学\",\"sType\":\"理科\"},{\"bookName\":\"物理\",\"sType\":\"理科\"}],\"person\":{\"age\":10,\"name\":\"刘宇\"}}";
         
         PersonBooks pBooks = new PersonBooks();
         List<Book> list=new ArrayList<Book>();
         
         Book b1 = new Book();
         
         b1.setBookName("数学");
         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<Book> list = null;
	public List<Book> getList() {
		return list;
	}
	public void setList(List<Book> list) {
		this.list = list;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	private Person person=null;

}

 

 第二种就是直接以字符串的方式不断的解析(这个是处理https://api.weibo.com/2/place/nearby_timeline.json?lat=39.91611756877837&long=116.38559999999804&range=11132&access_token=2.00QekzUDNVJpcE9536073d7a8o11IB&page=1&count=50&endtime=1371799367&starttime=1371795767

 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,一定要学会这种灵活运用的思维,举一反三,在一个新的东西中看到一些方法名,属性名,就应该才猜到是干什么的,同时要学会联想,结合已经有的知识去判断,比如tag,比如label这样的东西,要不然在两个相似的东西上面花费重复的时间,太不值得了!

一个东西的实现可能有多种实现手段,但是其本质,其原理都是一样的,学东西,不仅仅要知道如何去做,更应该了解为什么这样,虽然后者我们可能都不清楚,但是也起码应该知道其处理流程,只要思路正确,那就是如何去实现的问题,看来还需要牢记!

上面介绍的是json的序列化,如果是XML的序列化呢?类比可以知道,也可以通过定义类,然后采用C#提供的XML序列化的方法,不知道是否有兴趣尝试下呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值