我们都知道在互联网发展的初期时代,那时候采用的还是C/S架构的程序。
那么软件和软件传递的数据格式也从普通的文本转换到了XML这种格式化的存储格式文本。
那么在互联网移动互联网时代,这种C/S传递XML这种格式文件显然是不行的。
那么今天就来搞搞JSON。
我们来看看百度百科的解释:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
那么显然这种语言格式非常适合传递和解析,并且支持多种语言。
一个简单的JSON数据格式: 他包含了 一个KEY 和值 。写法是: {“KEY”:”VALUE”}
那么JSON 如果不支持负责的数据格式,那样显然是无法替代XML来作为传递的。
数组: [value,value]
复杂的集合:list ,map 等
更加复杂的结合体:
再复杂一点:
显然,看到这里 ,JSON的传递显然会符合你的要求:
我们再来看下标准的写法:一个标准的Map<List<Object>> 写法。 非常清晰
{
"people":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
一个复杂的Object 类:
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
}, {
"firstName": "Tad",
"lastName": "Williams",
"genre": "fantasy"
}, {
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
}, {
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}
说了这么多,开始正题,用C# 去操作JSON 然后进行传递数据,那么今天的教程只会写到如何生成和解析JSON 数据
在C#中操作JSON 数据的类库有很多,这里我们用到Newtonsoft.Json.dll 这个动态库。
那么引入进去之后我们就要开始干活了,在Java 中常常喜欢讲操作以Utils 定义,而C#喜欢用Helper 来定义。那还是遵循C#的归还,我们来定义一个
JsonHelper.cs
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.IO;
namespace Helper
{
public class JsonHelper
{
/// <summary>
/// 将对象序列化为JSON格式
/// </summary>
/// <param name="o">对象</param>
/// <returns>json字符串</returns>
public static string SerializeObject(object o)
{
string json = JsonConvert.SerializeObject(o);
return json;
}
/// <summary>
/// 解析JSON字符串生成对象实体
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="json">json字符串(eg.{"ID":"112","Name":"石子儿"})</param>
/// <returns>对象实体</returns>
public static T DeserializeJsonToObject<T>(string json) where T : class
{
JsonSerializer serializer = new JsonSerializer();
StringReader sr = new StringReader(json);
object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
T t = o as T;
return t;
}
/// <summary>
/// 解析JSON数组生成对象实体集合
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="json">json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])</param>
/// <returns>对象实体集合</returns>
public static List<T> DeserializeJsonToList<T>(string json) where T : class
{
JsonSerializer serializer = new JsonSerializer();
StringReader sr = new StringReader(json);
object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
List<T> list = o as List<T>;
return list;
}
/// <summary>
/// 反序列化JSON到给定的匿名对象.
/// </summary>
/// <typeparam name="T">匿名对象类型</typeparam>
/// <param name="json">json字符串</param>
/// <param name="anonymousTypeObject">匿名对象</param>
/// <returns>匿名对象</returns>
public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
{
T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
return t;
}
}
}
文中大多数是用实体转换过来的。那么我们在操作JSON 的时候最归还的做法是定义一个类,然后将该类实例化,最后进行转换。
如一个学生类:
namespace bean
{
public class bean
{
/// <summary>
/// 该操作ID 方便操作
/// </summary>
private String id;
public String Id
{
get { return id; }
set { id = value; }
}
/// <summary>
/// name
/// </summary>
private String name;
public String Name
{
get { return name; }
set { name= value; }
}
<span class="crayon-c">/// <summary></span><div class="crayon-line crayon-striped-line" id="crayon-5800e4a4ad652458391162-2"><span class="crayon-h"> </span><span class="crayon-c">/// age</span></div><div class="crayon-line" id="crayon-5800e4a4ad652458391162-3"><span class="crayon-h"> </span><span class="crayon-c">/// </summary></span></div><div class="crayon-line crayon-striped-line" id="crayon-5800e4a4ad652458391162-4"><span class="crayon-h"> </span><span class="crayon-m">private</span><span class="crayon-h"> </span><span class="crayon-t">int</span><span class="crayon-h"> </span><span class="crayon-v">age</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-5800e4a4ad652458391162-5"> </div><div class="crayon-line crayon-striped-line" id="crayon-5800e4a4ad652458391162-6"><span class="crayon-h"> </span><span class="crayon-m">public</span><span class="crayon-h"> </span><span class="crayon-t">int</span><span class="crayon-h"> </span><span class="crayon-e">age</span></div><div class="crayon-line" id="crayon-5800e4a4ad652458391162-7"><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="crayon-5800e4a4ad652458391162-8"><span class="crayon-h"> </span><span class="crayon-st">get</span><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-h"> </span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-v">age</span><span class="crayon-sy">;</span><span class="crayon-h"> </span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-5800e4a4ad652458391162-9"><span class="crayon-h"> </span><span class="crayon-st">set</span><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-h"> </span><span class="crayon-v">age</span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">value</span><span class="crayon-sy">;</span><span class="crayon-h"> </span><span class="crayon-sy">}</span></div><div class="crayon-line crayon-striped-line" id="crayon-5800e4a4ad652458391162-10"><span class="crayon-h"> </span><span class="crayon-sy">}</span></div>
<table class="crayon-table "><tbody><tr class="crayon-row"><td class="crayon-nums " data-settings="hide"> </td></tr></tbody></table>}
然后我们将类实例化:
这步搞定之后,我们就需要生成JSON 数据了:
OK,那么这样就生成成功了,我们来看看
显然这样是非常直观的,那么我们再将反转成对象。
非常简单对不对。ok 这里我们就完成了JSON 的简单操作。更加复杂的LIST 和Map 这些可以参照API 自行解决。