在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序列化的方法,不知道是否有兴趣尝试下呢?

Java JSON序列化杂谈的更多相关文章

  1. java JSON 序列化类(List<Object> 转String)

    import com.alibaba.fastjson.JSONObject; import com.google.common.base.Preconditions; import com.goog ...

  2. Java 的世界,我不懂:奇葩的 json 序列化

    先上张图,代表我心中的十万头草泥马: 写这么长的代码,头回见数组和单个实体共用同一个 json 节点的! 恐怕只有 java 社区的大牛B 才能做出这等事.. 由 Apache 发布: http:// ...

  3. JAVA与C#关于JSON序列化的比较

    JAVA CODE: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java. ...

  4. Java对象序列化与反序列化一 JSON

    Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student {    private String nam ...

  5. Java中的Json序列化,不容忽视的getter

    在开发的过程中,经常会碰到和自己预期不一样的情况.有的时候自己去研究一下还是很有趣的.这两天在写java web的时候,碰到了一个对象序列化的问题. 问题重现 public class AjaxJso ...

  6. Java下用Jackson进行JSON序列化和反序列化(转)

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

  7. java对象json序列化时忽略值为null的属性

    环境: jdk: openjdk11 操作系统: windows 10教育版1903 目的: 如题,当一个对象里有些属性值为null 的不想参与json序列化时,可以添加如下注解 import com ...

  8. Java中常见的json序列化类库 - Jackson

    Jackson 介绍 Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的Java Json解析器". Jackson框架包含了3个核心库:streaming,d ...

  9. java编解码技术,json序列化与二进制序列化

    1.何为json序列化与二进制序列化 通常我们在程序中采用的以json为传输,将json转为对象的就是json序列化了.而二进制序列化通常是我们将数据转换为二进制进行传输,然后在进行各类转换操作 2. ...

随机推荐

  1. apache http server 多线程模式

    一般apache采用prefork和worker机制,通过apachectl -l命令查看默认使用的prefork机制.需要修改prefork策略 那么需要做如下修改: 1,/usr/local/ap ...

  2. 经历:如何设置jquery easyui中下拉框不可编辑

    今天,在项目中碰到一个这样的问题,当选择按钮时候,查询条件是可以输入的,否则,表单框是不可用的[图1].但是,批量查询中的船名和装港用到了自动配置,即jquery-easyui中的combox的配置. ...

  3. java取随机数

    一, 指定的特定几个数据集合里按“随机顺序”全部取出 一碰到随机, 可能第一个想到的是用Math.Random() 来处理, 其实java本身提供了现成的类 通过 “打乱顺序”来处理“随机”问题 方法 ...

  4. java异常练习2

    /*有一个圆形和长方形都可以获取面积,对于面积,如果出现非法数值,视为获取面积出现问题问题通过异常来表示.先要对这个程序进行基本的设置 *//*首先想一下,怎么写这个程序基本属性是肯定要的求面积呢?1 ...

  5. NOIP200701

    题是这样的: 试题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再 ...

  6. 九度OJ 1532 棋盘寻宝扩展 -- 动态规划【背包问题】

    题目地址:http://ac.jobdu.com/problem.php?pid=1532 题目描述: 现在有一个8*8的棋盘,上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物(礼物的价值大 ...

  7. WinForm应用程序退出的方法

    this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出. Application.Exit(); 强制所有消息中止,退出所有的 ...

  8. Mysql多实例 安装以及配置

    MySQL多实例 1.什么是MySQL多实例 简单地说,Mysql多实例就是在一台服务器上同时开启多个不同的服务端口(3306.3307),同时运行多个Mysql服务进程,这些服务进程通过不同的soc ...

  9. Google设计理念

    Google的十大信条 我们首次拟就这“十大信条”还是在Google刚刚成立没几年的时候.此后,我们时常重新审视这份清单,看看它是否依然适用.我们希望这些信条永不过时,而您也可以监督我们是否遵守了这些 ...

  10. NOSQL之【Redis学习:配置说明】

    # yes:后台运行:no:不是后台运行(老版本默认) daemonize yes # redis的进程文件 pidfile /var/run/redis.pid # 端口 port # bind_a ...