1. JSON.NET概述

当JSON逐渐成为Ajax的标准数据交互格式时,在.NET中处理JSON数据只能使用字符串拼接的方法,十分麻烦,因而催生了JSON.NET这个项目。

JSON.NET是一个免费的开源项目,大家可以登录http://json.codeplex.com/下载最新版本,本书使用的版本是4.0 release 1,本节的示例将使用该版本进行演示。

JSON.NET的功能有很多,本书主要讲述以下两个Ext JS项目常用的功能:

通过序列化方法将.NET对象转换为JSON对象。

使用LINQ to JSON读写JSON对象。

2. 配置JSON.NET

在JSON.NET压缩包的bin目录下有Net、Net20、Net35、Silverlight和WindowsPhone5个目录,目录里有对应不同.Net Framework版本的库文件,根据使用的.Net Framework版本使用对应的库文件就可以了。譬如本书的例子使用的是.Net Framework 4.0版本,因而将Net35目录下的Newtonsoft.Json.Net35.dll文件添加到项目的bin目录就可以了。

要使用序列化功能,需在代码中加入以下引用代码:
using Newtonsoft.Json;

如果要使用LINQ to JSON,需在代码中加入以下引用代码:
using Newtonsoft.Json.Linq;

3. 序列化

在开发Web应用时,一般都需要将数据库查询出的数据转换为JSON格式文本传送回客户端,这就需要进行序列化。在JSON.NET中,要进行序列化,常用的是JsonConvert对象的SerializeObject方法。其基本的语法格式如下:
JsonConvert.SerializeObject(object)

代码中“object”就是要序列化的.NET对象。序列化后的返回值是字符串。

下面我们通过一个例子来加深一下认识。例子主要实现的功能是将微软示例数据库“Northwnd”中客户表(Customers)的所有客户数据以JSON格式返回客户端,其代码如下:
public string Message { get; set; }

protected void Page_Load(object sender, EventArgs e)
    {
        NorthwindEntities ne = new NorthwindEntities();
        var q = ne.Customers.OrderBy(m=>m.CompanyName)
  .Select(m=>new {
            m.CustomerID,
            m.CompanyName,
            m.Country,
            m.City,
            m.Address,
            m.PostalCode,
            m.Phone,
            m.Region
        });
        Message = JsonConvert.SerializeObject(q);

}

代码中,首先从实体模型中查询出数据集合“q”,然后将数据集合“q”序列化成JSON格式字符串并赋值给变量“Message”,最后在页面中输出。在浏览器中打开页面将看到以下的结果:
[{"CustomerID":"ALFKI","CompanyName":"Alfreds Futterkiste","Country":"Germany","City":"Berlin","Address":"Obere Str. 57","PostalCode":"12209","Phone":"030-0074321","Region":null},
…,
{"CustomerID":"WOLZA","CompanyName":"Wolski Zajazd","Country":"Poland","City":"Warszawa","Address":"ul. Filtrowa 68","PostalCode":"01-012","Phone":"(26) 642-7012","Region":null}]

从上面的例子可以看到,将查询数据序列化成JSON文本是一件非常简单的事。其实,对.NET对象的序列化还有很多方式,囿于篇幅,本书就不一一介绍了,有兴趣可以详细阅读JSON.NET的文档。

4. LINQ to JSON

事实上,Ext JS对数据返回的格式是有一定要求的,并不是简单地返回序列化后的数据就行,这时就需要用到LINQ to JSON。LINQ to JSON的作用就是根据需要的JSON格式组织文本数据。

LINQ to JSON需要使用到JObject、JArray、JPropery和JValue 4个对象,这4个对象的详细说明如表1-1所示。

表1-1 LINQ to JSON对象说明
对  象 说  明
JObject  生成一个JSON对象,形象点来说就是生成“{}”
JArray  生成一个JSON数组,形象点来说就是生成“[]”
JProperty  生成一个JSON数据,格式如下:
  JProperty(name,value)
  name:类型为字符串,关键字 
  value:类型为对象,值
JValue  直接生成一个JSON值。在生成仅有值的数组时,就需要使用JValue进行转换。其格式如下:
  JValue(value)
  value:类型为对象,值

下面我们通过一个例子说明如何使用LINQ to JSON。Ext JS的所需JSON格式数据一般如下:
{
 "total":5, //记录总数
 "rows":[
    //JSON对象格式的数据列表
 ]
}

示例将演示如何根据以上格式返回客户表数据,代码如下:
    public string Message { get; set; }

protected void Page_Load(object sender, EventArgs e)
    {
        NorthwindEntities ne = new NorthwindEntities();
        var q = ne.Customers.OrderBy(m => m.CompanyName)
            .Select(m => new
            {
                m.CustomerID,
                m.CompanyName,
                m.ContactName
            }
            ).ToList();
        Message = new JObject(
            new JProperty("total", q.Count()), //创建记录总数
            new JProperty("rows", 
                new JArray(    //创建数据数组
                    from p in q
                    select  new JObject(
                        new JProperty("id", p.CustomerID),
                        new JProperty("cpname", p.CompanyName),
                        new JProperty("contactName", p.ContactName)
                        )       
                    )
                )
            ).ToString();
    }

从上面的代码可以看到,构建固定格式的JSON数据是相当直观的。将粗体代码与格式数据对比,可以看到,最外层的JObject创建了格式中最外层的“{}”,然后依次使用JProperty生成记录总数数据和数据列表。而代码中的JArray的作用就是生成“[]”,将使用LINQ to JSON方式生成的一个个数据对象组合成数组。本来是希望直接通过LINQ to JSON将实体模型转换成JSON的,但这样会产生“LINQ to Entities 仅支持无参数构造函数和初始值设定项”的错误,因而本示例先将查询的数据转换为列表(ToList()),再进行转换。使用LINQ to JSON可直接在select语句生成JSON数据对象,无须其他转换过程,相当方便。在使用select语句生成数据对象时,首先使用JObject生成“{}”,然后使用JProperty生成对象的数据。

浏览器中打开页面,将看到以下的结果:
{ "total": 91, "rows": [ { "id": "ALFKI", "cpname": "Alfreds Futterkiste", "contactName": "Maria Anders" }, { "id": "ANATR", "cpname": "Ana Trujillo Emparedados y helados", "contactName": "Ana Trujillo" },
…,
{ "id": "WOLZA", "cpname": "Wolski Zajazd", "contactName": "Zbyszek Piestrzeniewicz" } ] }

注意 千万不要使用序列化的方式生成“rows”的值,如下面的代码:
    new JProperty("rows",JsonConvert.SerializeObject(q)) ;

因为这样生成的“rows”值是字符串,而不是数组。

5. 处理客户端提交的JSON数据

有时候,在客户端以JSON格式将数据提交到服务器比较方便。譬如,直接在Grid修改了不同行和列的数据,最后一次性将修改的数据提交到服务器端处理,这时候,使用JSON格式提交数据会很方便,例如以下提交的数据:
[
 {id:"12345",title:"文章一",author:"李四"},
 {id:"12367",author:"张三"},
 {id:"17777",isShow:true}
]

数据表示在Grid中修改了3行数据,第1行修改了标题(title)和作者(author),第2行修改了作者,第3行修改了是否显示(isShow)。

在服务器端使用JObject或JArray的Parse方法就可轻松地将字符串转换为JSON对象,然后通过对象的方法提取数据,下面是服务器端的处理代码:
    public string Message { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        string jsonString = @"
            [
             {id:'12345',title:'文章一',author:'李四'},
             {id:'12367',author:'张三'},
             {id:'17777',isShow:true}
            ]
            ";
        JArray json = JArray.Parse(jsonString);
        Message = @"<table border='1'>
                <tr><td width='80'>ID</td><td width='100'>字段</td><td width='100'> 值</td></tr>
            ";
        string tpl = "<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>";
        foreach (JObject jobject in json)
        {
           
            foreach (var a in jobject)
            {
                if(a.Value.ToString()!="id")
                    Message += String.Format(tpl, (string)jobject["id"], a.Key, a.Value);
            }
        }
        Message += "</table>";

在代码中,因为已知数据是使用数组形式提交的,所以采用JArray的Parse方法。

什么?你不知道数据是以数组还是对象形式提交?

这……

数据的提交方式应该是一种双方的约定,不然要处理未知的数据会很麻烦,所以不用担心这个问题。

第1层foreach循环用来获取JObject对象。第2层foreach用来获取修改过的字段名称。在这里要注意,数据默认已约定存在id这个字段。

代码运行后将看到如图1-4所示结果。

从结果可以看到,数据已经被分拆出来,这样你就可以根据id和字段去更新数据库了。

JSON.NET概述的更多相关文章

  1. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述

    [前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...

  2. js与json的区别,json的概述,json与面向对象,json与对象的转换

    <script> //js与json的区别,json的概述,json与面向对象,json与对象的转换 //json的概述:json(javascript object Notation,j ...

  3. 002-序列化装换JSON&XML概述

    一.概述 https://github.com/bjlhx15/java-serializer java-serializer 序列化项目 serialize-json-lib:json-lib框架 ...

  4. Json/Xml简介和处理模型

    JSON json简介 JSON是一种基于文本的数据交换格式,源自JavaScript,用于Web服务和其他连接的应用程序.以下部分介绍了JSON语法,JSON使用概述以及生成和解析JSON的最常用方 ...

  5. c# System.Text.Json 精讲

    本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...

  6. 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制

    [目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...

  7. web-day15

    第15章WEB15-AJAX和JQuery案例篇 今日任务 使用AJAX完成用户名的异步校验 使用JQuery完成用户名异步校验 使用JQuery完成商品信息模糊显示 使用JQuery完成省市联动效果 ...

  8. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  9. GHOST CMS - 结构 Structure

    Structure Ghost主题包含静态HTML模板,这些模板使用helper类从站点输出数据,并使用定制的CSS进行样式化 A Ghost theme contains static HTML t ...

随机推荐

  1. android 在activity中改变标题栏的标题 tabActivity的标题改变

    在activity中改变标题栏的标题是调用setTitle()方法,参数为标题名称. 而tabActivity跟Activity是一样的,因此在onCheckedChanged()方法中要动态改变标题 ...

  2. Druid数据库连接池两种简单使用方式

    阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 简单使用介绍 Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部 ...

  3. Android USB Host与HID通讯 (二)

    不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...

  4. Spring cloud项目实践(一)

    链接地址:http://sail-y.github.io/2016/03/21/Spring-cloud%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B5/ 什么是Spring ...

  5. linux PCI设备初始化过程

    linux PCI设备初始化过程 start_kernel->rest_init 这个函数会启动一个核心线程0, 核心线程然后调用init -> do_basic_setup. 然后我们开 ...

  6. c#执行并行任务之Parallel与TaskFactory

    任务:几千条(大量)数据往服务器数据库填写.要求单开线程执行,分割成小数据包,多线程运行. 实现方法:Parallel与TaskFactory都可以. 主要代码: Parallel: Barrier ...

  7. hihocoder #1289 : 403 Forbidden (2016 微软编程笔试第二题)

    #1289 : 403 Forbidden 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi runs a web server. Sometimes ...

  8. hadoop2.2编程:Tool, ToolRunner, GenericOptionsParser, Configuration

    继承关系:   1. java.util Interface Map.Entry<K,V> description: public static interface Map.Entry&l ...

  9. 利用switch case判断是今天的第多少天

    static void Main(string[] args)        {            while (true)            {                int m1 ...

  10. 使用console进行性能测试和计算代码运行时间

    对于前端开发人员,在开发过程中经常需要监控某些表达式或变量的值,如果使用用debugger会显得过于笨重,最常用的方法是会将值输出到控制台上方便调试.最常用的语句就是console.log(expre ...