前言

  最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net的平台开发服务,传递Json格式的数据。那么先来介绍一些什么是JSON。

JSON

  Json(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JS的一个子集。 Json采用完全独立于语言的文本格式。这使得Json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

  Json简单来说就是JS中的对象和数组,所以Json也存在两种结构:对象、数组。

  • Json对象:Json对象定义在花括号“{}”内,以Key:value键值对的形式存放数据,多个数据使用分号“;”分割。

  • Json数组:Json数组定义在方括号“[]”内,以字符串的形式存放数据,多个数据使用分号“;”分割。

Json序列化与反序列化

  对于.Net而言,从3.5之后就提供了DataContractJsonSerializer类,需要引用DLL,System.Runtime.Serialization。使用方式很简单,需要知道待转换的对象的类型,然后通过MemoryStream流写入的方式转换。对于DataContractJsonSerializer对象而言,序列化和反序列化只需要了解两个方法即可,这两个方法都具有多放重载,适用于不同的环境,这两个方法是:

  • WriteObject:将指定对象序列化为Json数据,并将生成的 Json写入流中。
  • ReadObject:以 Json格式读取文档流,并返回反序列化的对象。

  使用DataContractJsonSerializer序列化对象和反序列化Json都比较简单,下面给出示例代码:

         private static string getJsonByObject(Object obj)
{
//实例化DataContractJsonSerializer对象,需要待序列化的对象类型
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
//实例化一个内存流,用于存放序列化后的数据
MemoryStream stream = new MemoryStream();
//使用WriteObject序列化对象
serializer.WriteObject(stream, obj);
//写入内存流中
byte[] dataBytes = new byte[stream.Length];
stream.Position = ;
stream.Read(dataBytes, , (int)stream.Length);
//通过UTF8格式转换为字符串
return Encoding.UTF8.GetString(dataBytes);
} private static Object getObjectByJson(string jsonString, Object obj)
{
//实例化DataContractJsonSerializer对象,需要待序列化的对象类型
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
//把Json传入内存流中保存
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
// 使用ReadObject方法反序列化成对象
return serializer.ReadObject(stream);
}

  通过这个转换类,可以对对象进行序列化成Json和反序列化成对象。但是存在一个问题,就是对于集合类型的数据,可以序列化成Json,但是把这个Json反序列化则会失败,我在这里也没有找到更好的办法反序列化集合类型的数据。现在就一些常见.Net类型的数据进行序列化展示。

  新建一个获取数据的类JsonObject,在其中分别返回一个Person(id,name,age)对象、List<Person>对象、List<string>对象,List<Dictionary<string, object>>对象,分别看看序列化后的数据。

  JsonObject类:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebDemo.Json
{
static public class JsonObject
{
static public Person getPerson()
{
Person person = new Person();
person.id = ;
person.name = "slive";
person.age = ;
return person;
}
static public List<Person> getPersonList()
{
List<Person> personList = new List<Person>();
Person person = new Person();
person.id = ;
person.name = "slive";
person.age = ;
Person person2 = new Person();
person2.id = ;
person2.name = "jack";
person2.age = ;
Person person3 = new Person();
person3.id = ;
person3.name = "damon";
person3.age = ;
personList.Add(person);
personList.Add(person2);
personList.Add(person3);
return personList;
}
static public List<string> getStringList()
{
List<string> stringlist = new List<string>();
stringlist.Add("jack");
stringlist.Add("dick");
stringlist.Add("sean");
return stringlist;
}
static public List<Dictionary<string,object>> getDicList()
{
List<Dictionary<string, object>> dicList = new List<Dictionary<string, object>>();
Dictionary<string, object> dic1 = new Dictionary<string, object>();
dic1.Add("id", );
dic1.Add("name", "jerry");
dic1.Add("age", );
Dictionary<string, object> dic2 = new Dictionary<string, object>();
dic2.Add("id", );
dic2.Add("name", "meimei");
dic2.Add("age", );
Dictionary<string, object> dic3 = new Dictionary<string, object>();
dic3.Add("id", );
dic3.Add("name", "damon");
dic3.Add("age", );
dicList.Add(dic1);
dicList.Add(dic2);
dicList.Add(dic3);
return dicList;
}
}
}

  分别对JsonObject返回的数据进行序列化,可以看到结果:

  • getPerson():{"age":24,"id":20,"name":"slive"}
  • getPersonList():[{"age":24,"id":20,"name":"slive"},{"age":34,"id":30,"name":"jack"},{"age":54,"id":40,"name":"damon"}]
  • getStringList():["jack","dick","sean"]
  • getDicList():[[{"Key":"id","Value":17},{"Key":"name","Value":"jerry"},{"Key":"age","Value":24}],[{"Key":"id","Value":18},{"Key":"name","Value":"meimei"},{"Key":"age","Value":23}],[{"Key":"id","Value":19},{"Key":"name","Value":"damon"},{"Key":"age","Value":28}]]

总结

  最近一直在研究Android开发,所以涉及到Json的解析问题,才会想着找找对于Json对象的序列化的实现。Json作为一个独立于语言的文本,使用什么语言并不重要,这里只是需要把数据对象序列化为Json,传递给Android客户端做准备,虽然这种方式对于集合的反序列化存在问题,但是不影响序列化与数据传递。

  请支持原创,尊重原创,转载请注明出处。谢谢。

C#--对象转Json序列化的更多相关文章

  1. 序列化对象C++对象的JSON序列化与反序列化探索

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...

  2. C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化

    在前两篇文章中,我们已经完成对普通对象以及复杂对象嵌套的序列化与反序列化,见如下地址: C++对象的JSON序列化与反序列化探索 C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化 ...

  3. C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化

    本文是基本上一篇博文进行改进而成,上一篇请见: C++对象的JSON序列化与反序列化探索 此处就不多说了,直接上代码. 1. 序列化基类 #pragma once #include <strin ...

  4. C++对象的JSON序列化与反序列化探索

    一:背景 作为一名C++开发人员,我一直很期待能够像C#与JAVA那样,可以轻松的进行对象的序列化与反序列化,但到目前为止,尚未找到相对完美的解决方案. 本文旨在抛砖引玉,期待有更好的解决方案:同时向 ...

  5. 对象转Json序列化

    C#--对象转Json序列化 前言 最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net ...

  6. Object of type 'ListSerializer' is not JSON serializable “listserializer”类型的对象不可JSON序列化

    Object of type 'ListSerializer' is not JSON serializable “listserializer”类型的对象不可JSON序列化 一般原因为 序列化的对象 ...

  7. 对String对象进行JSON序列化

    对对象进行JSON序列化,会得到类似key:value的形式. 但是如果对一个String字符串进行JSON序列化会得到什么? 测试下: public class TestMain2 {     pu ...

  8. 转载C# 对象转Json序列化

    转载原地址:  http://www.cnblogs.com/plokmju/p/ObjectByJson.html JSON Json(JavaScript Object Notation) 是一种 ...

  9. ExpandoObject对象的JSON序列化

    如果: dynamic expando = new ExpandoObject(); d.SomeProp=SomeValueOrClass; 然后,我们在控制器中: return new JsonR ...

随机推荐

  1. T-3-java核心API-基础类

    一.API 现成的类(程序) Java API是java(Oracle)提供的系统标准API. 第三方的jar包API,如:JUnit.jar. 可以自己开发一些API. 一般情况下任何技术都有现成的 ...

  2. 学习Acegi应用到实际项目中(7)- 缓存用户信息

    在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-failsafe.xml文件所定制 ...

  3. java+phantomjs实现动态网页抓取

    1.下载地址:http://phantomjs.org/download.html 2.java代码 public void getHtml(String url) { HTML="&quo ...

  4. easyUI dialog打开对话框,显示列表数据,选取一条数据操作后赋值给父窗口 resultMap声明为全局,生成getset方法

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  5. 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF

    当要往有设置自增标识字段的表插入数据,并希望同时设置好自增字段的值时,可以在insert into 的SQL语句前后分别加上一句sql语句,SET IDENTITY_INSERT TableName  ...

  6. 与我们息息相关的internet服务(2)---WWW服务

    在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的公司网站    网站,在初中,那时浏览一个网页可叫网上冲浪,听起来似乎比洗澡还爽快,可现在这词就是土鳖,网上冲浪火起来主要是应 ...

  7. 【转】RPC介绍

    转自:http://www.cnblogs.com/Vincentlu/p/4185299.html 摘要: RPC——Remote Procedure Call Protocol,这是广义上的解释, ...

  8. VUE最佳实践

    vuex 作为model数据请求由action来获取,页面组建级的发送action,返回promise给组建使用,如果使用周期较长需comit到mutation保存到state. 数据分模块,根据业务 ...

  9. 我人生做过的第一个信息化项目--TIPTOP 5.0 ERP项目

    我人生做过的第一个信息化项目--TIPTOP 5.0 ERP项目 2008年8月毕业不久,我参与了我人生的第一个信息化项目:TIPTOP 5.0 ERP项目.

  10. 《Pyhton语言程序设计》_第7章_对象和类

    #7.2.1_定义类 一个类的功能:数据域.定义方法.初始化程序 初始化程序总是被命名为:_ _init_ _ (两个连续的下划线) #7.2.4_self参数 #self参数是指向对象本身的参数,那 ...