zoukankan      html  css  js  c++  java
  • 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}sd{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序列化的方法,不知道是否有兴趣尝试下呢?

  • 相关阅读:
    poj 3126 Prime Path
    poj 2255 Tree Recovery
    spoj 7259 LITE
    poj 1742 Coins
    poj 1915 Knight Moves
    poj 2352 Stars
    【祝贺】gooogleman嵌入式开发板联盟图标设计完成,Let me Show!
    【讨论】TE6410/OK6410 开发板dnw c0008000是什么意思, ?
    【讨论】为什么我的300W摄像头偶尔会拍照不成功?
    【探讨】关于2440 触摸屏驱动的怪异现象分析
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/3149510.html
Copyright © 2011-2022 走看看