文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

背景介绍

我已经阅读了许多关于JSON和C#的博客和文章,所有文章都在阐明一件事或另一件事: JSON或C#的库. 如果你不了解JSON 或C#库是如何处理与解析JSON文件的,我想在一篇文章中将这两项技术都包含,这样你可以充分理解这两个概念. 我将尽我所能的解释它们,解释它们库的概念,并尝试将文章发布到《C# Corner》, 并且制成电子书进行分享.所以请原谅我在不同的编写格式间来回跳,因为我必须坚持两种风格,以便区分这是篇文章还是小型指南.

当我开始进行一些小的编程时,我知道那里有许多的数据交换格式,序列化与反序列化技术,如何将对象与它的状态一同存储到硬盘上,稍后从硬盘将相同的数据再取回来,对同一对象做进一步的加工与处理.其中有些技术非常难于处理与理解,但有些非常简单,框架已经提供了. 现在进入到JSON的世界中,JSON为你提供了非常简单的和相似的编程接口,在运行时序列化和反序列化对象,使得对象的状态可以保存并在稍后使用. 现在我们将要学习JSON数据交换时的符号表示,并且在C#项目中怎么使用这种形式.

什么是 JSON?

我记得当我开始学习编程时,有种东西叫做:可扩展标记语言,或就像我们所知道的XML.XML用于转换运行时对象数据或程序状态或配置设置使用字符串保存.这些字符串是人类可阅读的.程序员也可以在需要的时候修改这些值,新增一些值或删除一些不想在数据中看到的值.

 XML介绍

很长一段时间,甚至是今天,XML也还在用于数据格式交换.许多通讯协议是以XML为基础建立的,特别是SOAP协议. XML并没有使这些协议变得强大,但是它为全面推扩并使用标记语言起了很大作用,你非常熟悉的HTML和XAML就是 .

icon
                                                Figure 1: XML file icon.

它的历史,XML已经成为大部分开发者用于构建在不同的机器间共享数据的最佳应用.万维网开始使用XML格式来编写网页,叫作超文本标记语言(HTML).

早期的XML目的是用于设计人类可阅读的纯文本文档,并可被机器用于定义应用程序\程序\接口的状态.

第 1 段(可获 6.5 积分)

1.应用程序的状态

你可以将对象的状态保存,用于后期对数据做进一步的处理。这同样适用于维护应用程序的状态。

2.程序

当程序启动时,可以使用XML定义配置文件。微软已经使用web.config和machine.config来定义程序将怎么启动。程序开发人员可以按需修改配置文件。如果修改了配置将会影响程序的启动方式。

3.接口

HTML已经被用于渲染用户图形界面。WPF(Windows Presentation Foundation)用XAML作为接口设计的主要开发语言,Android支持用XML标签来定义UI组件。

第 2 段(可获 1.55 积分)
<?xml version="1.0" encoding="UTF-8"?>

空的XML文档并非意味者包含空的对象或空文档树,在这里是允许被忽略的。

这并不是它的全部。XML能表达的比这多的多,例如支持SOAP通讯协议的WCF。它允许你通过XML格式上传或下载数据。ASP.NET的Web API允许通过XML文档来交换数据。

XML的使用

下面我将展示XML是如何使用的,那为什么不用一些现实世界中的事物来介绍呢。例如RSS,使用基于XML的文档向客户发送他们喜好的内容。在我的博客上使用了这个技术,向读者或博友推送文章。单个标准的 XML文档是这样的:

第 3 段(可获 1.7 积分)

我剪掉了大部分内容,只留下了重要的XML内容。这些数据是人类可识别的,如果我们需要转换这些数据,它可以在运行时自动将数据与对象进行关联。以同样的方式,我们可以在机器间通过序列化与反序列化的方式共享数据。

什么是JSON?

JSON技术出现在1996年左右。XML与JSON有着相似目标:在各种设备、网络和应用程序间进行数据交换。然而它的语法与使用面向对象的C、C++、Java和C#语言非常相似,特别是用C语言的程序员。它的语法与JavaSciprt使用者描述对象的方式也非常相似。JSON使用了非常紧凑的格式用于保存数据。就向指引中提供的JSON数据一样,在大部分情况下与XML相比非常的简短,在网络应用程序中每一个字节都将影响程序的性能与效率。我想借此来喷下XML,可能在你的心里认为我的话带有偏见。所以首先我们讨论的是JSON是怎样的一种结构,接下来我们讨论JSON与XML的不同之处,最后你更倾向于哪一个。

ECMA-404中定义了JSON的格式与规范。文档中指导开发者按标准找到相应的API。API的开发者或程序员通过这个文档可以明白怎么定义数据,并对JSON 进行解析与转换。

JSON结构

JSON是开放标准的文档格式,是人类可识别并且机器可序列化与反序列化它的数据。简单来说它用于数据交换。同样的目标和数据,相较于XML,使用JSON的好处是它提供更紧凑的格式并且数据也更小。 JSON保存数据是键/值对的形式。JSON的另一个好处是跨语言的(XML也是)。你可以使用绝大多数语言来处理JSON格式的字符串对象。几乎是我能想到的所有语言都运行JSON进行数据交换。比如ASP.NET Web API支持JSON格式的数据与服务器进行交互。

最基本的JSON对象是非常简单的。每个JSON对象都必须有一个根节点或者是数组。对象或数据可以不包含任何数据,但必须有一个对象或数组。

最最简单的JSON对象就是这个:

{}

它代表什么呢,我将在后续为您揭晓。在这里仅需要理解在程序中他是一个空的JSON对象。一个JSON对象的值也可以包含其它键/值对数据,就像是下面的这些数据类型。

第 4 段(可获 6.9 积分)
  1. 对象
  2. 数组
  3. 字符串; 姓名或字符.
  4. 数字型; 数字
  5. 布尔型; 真或假
  6. 空.

注意JSON并不支持所有的JavaScript关键字,在验证JSON有效性时,你不能使用"undefined". 没有什么会阻止你在文件中使用它,但是请记住验证JSON有效性不能包含类似的值.另一点需要注意的是JSON文件是不可执行的,即使它共享相同的对象符号,但是它并不允许你创建变量.如果你尝试添加新的变量,它将会产生错误.下面我来分享一些验证JSON数据类型的一些概念,这些数据类型是什么,在JSON数据文件中怎么使用它们.

JSON数据类型

有效的JSON 数据类型的值是允许在JSON文件中使用的.在这里我想说明一下它的保留关键字,自己的项目中如何使用它们进行数据格式转换.

JSON 对象

JSON对象的根应该是一个JOSN对象或JSON数组.在JavaScript或者在其它编程语言中一个对象使用"{}"表示. 在JSON文件中它使用相同的符号来表示,对象只包含它所拥有的属性.JSON可以使用其他属性,其他数据类型(包括对象)作为它们的属性值.我会在后续的本教程中解释它是怎么工作的.但是现在需要理解每次的运行时对象都关联到数据文件中的一个JSON对象.下面是一个JSON对象的示例,

第 5 段(可获 4.25 积分)
{  
    "name": "Afzaal Ahmad Zeeshan",  
    "age": 20  
}  

即使是最初级的C#, Java或C++程序员都能理解这些属性的值可以使用哪些类型.非常明显"name"属性是"字符串"类型,并且"age"属性是数字类型.

但是有一些规则,你可能需要考虑一下: 

  1. 一个对象内部可以包含任意数量的属性.
     
  2. 作为一个空对象时,对象的属性可以省略.
  3. 所有的属性名 (键) 都是字符串. 你不能省略键的双引号.它是必须的, 否则 JSON 会提示:期望值是一个字符串,但找到了undefined.
  4. 键/值对 之间用冒号分隔, 而多个键值对间用逗号分隔.你不能在JSON字符串格式后添加逗号,一些API可能会报错. 例如, JSON.parse(‘[5, ]’); 将返回一个异常.
第 6 段(可获 1.86 积分)

我将在后续的章节中演示这个错误,因为现在我想为你展示并教你一些JSON的基本信息.同时我也会介绍它们是如何工作的.

现在你已经理解了JSON对像类型.你需要记住一点:JSON对象并不仅仅用于表示JSON文档的根节点.它也用于表示对象属性的值,JSON文档可以用于展示并包含所有对象间关系的数据,唯一的区别就是对象都是其名的.

JSON数组

就像JavaScript,JSON也支持将对象存储在序列,系列或列表中;无论你将它作为哪种来使用.JSON文档中的数组结构并不复杂,它们是:

第 7 段(可获 1.78 积分)
  1. 简单。
  2. 以 [ 开头,以 ] 结束。
  3. 可以包含序列。
  4. 每个值用逗号隔开(注意不是冒号)。
  5. 值可以是任意类型。

一个简单 JSON 数组就像这样:

[ "Value 1", "Value 2" ]

你可以在数组中保存任何类型的值,和其它编程语言有些不一样,比如C#\C++。数组中的元素类型并不强制要求保持一致。这将导致C#\C++的程序员无法一眼就理解。但是,伙计们,这是JavaScript。我用 JSONLint 服务来验证这个,之后,我将告诉你它在JavaScript中是如何工作的 。

JSONLint
图 2:使用JSONLint 来验证 JSON 格式的有效性。

在 JavaScript中,数组中的元素类型并不需要保持一致。 所以正如下面的例子,你可以放心大胆的使用,并不需要觉得有任何不妥。

var arr = [ "Hello", 55, {} ];

JSON 是由 JavaScript衍生出来的文档格式, 遵循相同的约定。 JSON 在程序员中的概念是一致的,在C++\C#等强类型的编程语言中,数组元素类型是需要保持一致的,但JavaScript是弱类型编程语言,因而不受此约束 。 所以只要不违反其它原则,在JavaScript中数组元素可以是任意类型。

未来,数据类型可能将向现有编程语言的数据类型靠拢,如字符串,数字,布尔类型等。 后续我会尽量少解释他们,因为我觉得这两点我已经说的够多了。

JSON 字符串

如果值中包含字符串,那么它的类型就是字符串类型。在大部分编程环境中,字符被称为包含一组字符的数组。 在 JavaScript中,你可以用单引号或双引号来表示字符串的值。 但是,在JSON中,你必须使用双引号来表示字符串值。 如果非要使用单引号也可以,但只能在JavaScript中使用。如果你需要通过网络与其它强类型检查的程序语言C++\C#做数据共享时,它们在尝试解析以字符开始的字符串时,你的单引号有可能引发一个运行时异常。

上面展示的字符串示例,JSON的字符串与JavaScript是一样的。 下面展示一些常用的JSON字符串示例:

第 8 段(可获 5.1 积分)
// 普通字符串  
"Afzaal Ahmad Zeeshan"  
  
// 同上,不过JSON中不用单引号字符串
'Afzaal Ahmad Zeeshan'  
  
// 转义字符,输出: "\"  
"\"\\\""   
  
// Unicode 字符
"\u0123"  

上面的示例中,我们使用了很多字符串。 还可以做:

  1. 像C#\C++一样创建普通字符串。
     
    • JSON标准中禁止使用单引号,因为有可能你会把数据发送到其它平台。
       
  2. 转义字符在字符串中是必需的。 换句话说,字符串有可能导致未定义错误。 你可以使用与其它语言通用的转义符:
     
    • \”
    • \\
    • \/
    • \b
    • \f
    • \n
    • \r
    • \t
    • \u-长度为4的十六进制数
       
  3. 在JSON同样支持Unicode字符 (上例中最后一个就是) ,你可以在这里指定Unicode字符串。
第 9 段(可获 1.3 积分)

有件事你需要思考一下,对象的属性也都是用字符串表示.

{  
    "key": 1234  
}  

structure
                                             图 3: JSON 字符串结构.

由此可见JSON中的字符串与其它编程语言(框架)是一致的.

JSON 数字类型

和字符串类型一样, 在JSON文档中数字类型的值就是它的字面值. 它们不需要用引号包含,如果它带有引号,就表明它是一个字符串类型,而非数字类型.

下面给出一些数字类型示例,

第 10 段(可获 1.73 积分)
// Simple one  
1234  
  
// Fractional  
12.34  
  
// Exponential  
12e34  

你可以将小数与指数组合在一起使用.你也可以在数字后边追加单个数字(负数-或正数+).在JSON中,这些类型也可以被做为值.如果你回头看看前几章节的示例,你可以看到我使用数字型的值来表示age属性.还有一些其它的事你需要考虑,在处理JSON数据时,

  1. 使用指数形式式时,e和E是一样的.
  2. 它不允许以e结尾.
  3. 数字不允许是一个NaN(非数字).
  4. 数字编码和变量取值范围应该考虑.JavaScript和其它语言处理数字编码和取值范围时有些不同,并且可能引起内存溢出.
第 11 段(可获 1.54 积分)

JSON 布尔型

在一个表达式中,布尔值表示有条件的操作结果.例如, “如果他是成人,让他进来”.JSON 支持存储布尔符号的值.这与其它编程语言是保持一致的.使用时布尔符号值时,不需要用引号将它们引起来.如果布尔值是用引号引起来的,那么它就不是布尔值,而是字符串值.

// Represents a true result  
true  
  
// Represents a false result  
false  

必须这样写,因为JavaScript是大小写敏感的,并且JSON也是.你可以使用这些值来表示一种场景,就是无法使用其它更多的值来表示这种场景. 例如,你可以用它表示对象的性别.

第 12 段(可获 1.56 积分)
{  
    "name": "Afzaal Ahmad Zeeshan",  
    "age": 20,  
    "gender": true  
}  

在这里我使用"真"替代"男性".换句话说我可以换种方式来表达如:

if (obj.gender)   
{  
    // Male  
} else   
{  
    // Female  
}  

在这里使用字符串或数字,我们将它保存为布尔值会更好.这将会使我们的文档结构,简单清晰且可读性强.

JSON 空值

使用C的程序员知道什么是空.在我的编程生涯中,使用的编程语言有C,C++,C#,Java和JavaScript,并且我也使用这个关键字表示对象不存在.还有一些其它编程语言如Haskell,空值在这里没有太大意义.但是因为我们只计论JavaScript,编程语言都喜欢空值,但我们知道空值是什么.空值只表示内存中不存在此对象.在JavaScript中,这表示没有意义的对象.所以在JavaScript环境中,表示存在空值对象,但它没有值.在其它语言中,刚好相反,甚至连对象都不存在.

null仅仅是一个符号.

空值

它是一个关键字,并且必须这么写.否则,同样为null的情况下JavaScript将会弹出"undefined". 这可以帮你发送目前不存在的数据.例如,在C#中,我们可以使用空值,将它传到允许为空的数据库内.在C#有允许为空的类型,我们就将它与null对应.如下的示例,JSON文档将会关联到C#对象上,

第 13 段(可获 3.14 积分)
{  
    "name": "Afzaal Ahmad Zeeshan",  
    "age": null  
}  
//C# object structure(class)  
class Person  
{  
    public string Name   
    {  
        get;  
        set;  
    }  
    public int ? Age   
        {  
            get;  
            set;  
        } // Nullable integer.  
}  

在数据库中如果这个字段被设置为允许为空,我们可以将数据库中的记录设置为空.在这里, JSON可被用于表示运行时对象,在数据交换时使用纯文本格式的字符串表示.

使用示例

我不想对此再做延伸了.JSON已经被大部分的公司广泛的接受了,甚至是微软.微软过去一直用XML格式的web.config作为应用程序的配置文件.尽管,现在他们已经升级了系统,转而用JSON方式来实现应用的配置.JSON非常简单,也更容易处理.

微软已经开始使用JSON 格式来处理Visual Studio Code 产品的设置. JSON 允许扩展设置, 帮助用户向产品中添加自己的修改记录与产品配置.

我已经发布了许多关于JSON数据代码的文章,并且我想如果我开始使用JSON,相对于XML来说,它就标志着JSON的成功.

第 14 段(可获 2.14 积分)
  1. 使用ASP.NET创建一个“自定义”的个人博客
  2. 使用真实案例理解ASP.NET MVC,适用于初级和中级人员

JSON还有很多其他用法,我个人推荐使用JSON,如果你使用JSON比XML熟练。但是,如果你对XML感兴趣,或者当你使用SOAP协议时,则应该使用XML。否则,请考虑使用JSON。

JSON中的错误

不,这些都不是JSON本身的错误,而是你自己在写JSON文件时犯的一些错误。这就是为什么,总是考虑使用一个库。

尾逗号

正如前面提到的,在JSON对象或数组后面的逗号引发的问题。解析器可能会认为接下来有另一个属性,但却意外地遇到了一个结束的方括号或大括号。例如,以下是无效的JSON文件,

第 15 段(可获 1.8 积分)
{ "k": "v", } // 以逗号结尾  
  
[ 123, "", ] // 以逗号结尾  

对你来说这些是可以避免的, 

  1. 首先,编写你自己的解析器.
  2. 简单地来说,让它们足够聪明,能知道如果没有属性,自动忽略添加属性.
  3. 如果数组内的逗号后边没有值了,这代表数组结束于前一个符号.然而,目前的解析器并不能做到足够聪明,所以我的建议就是忽略它.

    以“e” 或 “E”结尾

如果你的指数(数字型)是以e结尾,你可能会得到一个未定义的异常.你知道那意味着什么,难道不是吗?最好以它规范的形式来编写是最好的.

未定义

每个属性名称必须是一个字符串. 在 JavaScript中 下面两个都是可行的,

第 16 段(可获 1.71 积分)
var obj = { "name": "Afzaal Ahmad Zeeshan" };  
  
// OR  
var obj = { name: "Afzaal Ahmad Zeeshan" };  

但是,在JSON里面你需要遵循用字符串作为键名的方法去创建和定义一个对象属性,在JSON中,下面的写法是错误的:

{  
    name: "Afzaal Ahmad Zeeshan"  
}  

Json.NET
                  Figure 4: Json.NET 和其它常用的JSON序列化工具的对比。

我将使用这个库所提供的对象仅仅去展示如何将JSON文件解析成运行时对象,并展示如何使用提供给序列号工具的对象去创建JSON字符串(序列化这些对象)。 文章的末尾你将能够创建自己的面向并支持JSON的.NET框架(或者其他支持C#的框架)的应用程序。


创建对象

在C#里面, 我们创建类来处理真实世界的对象. 我们可以使用这个库将类的运行时结构转换成可存储的JSON文档,这样可以用来,

第 17 段(可获 5.31 积分)
  1. 在网络中发送这些数据,
  2. 将数据保存在磁盘中,
  3. 缓存下来,下一次相同场景中使用.

还有其他许多用途.这一处理过程对应的是对象的反序列化,将json格式数据转化为对象数据(使用数据时,将json字符串转化为运行时程序所需要的对象).首先,创建一个简单的实体类,该类可以用来将对象转化为json数据,也可以将json数据转换为实体对象.

class Person   
{  
    public int ID   
    {  
        get;  
        set;  
    }  
    public string Name   
    {  
        get;  
        set;  
    }  
    public bool Gender   
    {  
        get;  
        set;  
    }  
    public DateTime DateOfBirth   
    {  
        get;  
        set;  
    }  
}  
第 18 段(可获 0.79 积分)

 

这个对象有以下类图。

Person class diagram
图5: 人的类图。

坦率地说,这个对象可以在C++中创建,可以在java中创建也可以在JavaScript中创建。如果我们使用JSON序列化该对象,或者可以通过网络传输到网络上的对等体的对象数量。由于我们的数据以JSON字符串表示,我们现在可以使用其他语言解析字符串数据。所有其他的编程语言都有一个JSON解析器库。

我们可以重新定义其他编程语言中的结构,然后使用JSON解析器库通过网络在这些机器中转换这个字符串。 我将仅涉及C#编程的部分。

在我们继续之前,你可能想知道以下一些事情。 我使用了“DateTime”的数据类型,因为我想展示当它们被序列化为JSON表示时派生类型是如何转换的。 所以,让我们开始C#编程来了解C#对应的相关的东西。

序列化对象

在编程中,序列化是将运行时对象转换为纯文本字符串格式的过程。 换句话说,它将对象结构从内存转换为可以存储在磁盘上的格式。 序列化只是转换对象的状态,它只是将对象的属性转换为可用于存储它们供以后使用的格式。 你可以将其视为同步过程,你可以将对象的当前状态存储在磁盘上,以便稍后加载数据,并从你离开的状态开始工作,而不是再次从头开始。

因为我们在这里讨论JSON,所以我们感兴趣的是在存储(序列化)的JSON表示法中转换对象,然后在接下来的部分将JSON文档转换为运行时对象和数据结构(反序列化)。 简单地说,我们将看到如何将JSON转换为对象,反之亦然。

要序列化对象,需要一个保存数据的对象。 该对象在应用程序中将具有状态。 然后我们调用库函数以JSON格式序列化对象。 就像这样,

第 19 段(可获 4.91 积分)
// 创建Person对象
Person myself = new Person  
{  
    ID = 123,  
        Name = "Afzaal Ahmad Zeeshan",  
        Gender = true,  
        DateOfBirth = new DateTime(1995, 08, 29)  
};  
  
// 序列化这个对象.  
string serializedJson = JsonConvert.SerializeObject(myself);  
  
// 将对象信息打印在命令行屏幕中  
Console.WriteLine(serializedJson);  

调用方法序列化一个对象,显而易见,返回了一个string类型的对象,这个string类型的对象持有Person对象经过JSON格式化后的数据,程序输出如下所示(为了增加可读性,已经格式化数据):

第 20 段(可获 0.49 积分)
{  
    "ID": 123,  
    "Name": "Afzaal Ahmad Zeeshan",  
    "Gender": true,  
    "DateOfBirth": "1995-08-29T00:00:00"  
}  

将这些数据保存在文件中,通过网络发送这些数据或者做一些其他必须做的事情.我们可以使用json数据做很多事情,这些依据我们应用的设计和流程而定.现在,我们需要了解数据是如何产生的.

ID,Name(姓名),Gender(性别),这些数据类型是我们已经见过的,但是,最后一个字段是一个DataTime类型的字段,他被Json自动转换成了一个string类型的数据.这是为什么呢?答案很简单,Json并不支持使用原生的DataTime对象来保持日期和时间.并且它使用string类型来存储日期的值.string的值足以解释该日期所包含的意义,年月日分别是多少. 十分秒也很直观.

注意:C#和Json能够使用null值(空值)来表示一个对象,因此如果一个对象中name(姓名)被设置成一个空值,json能够支持在json格式的数据中对应的给name设置一个空值.下一节中,我们将学习json是如何被映射到对象的.

JSON反序列化

在数据交换中,json反序列化对应的是数据的序列化.在这个过程中,我们获得json数据,将其转换为运行时的对象(或者集合),在解析json对象时有许多类库可以使用,但是,我将继续使用上述类库,用它演示C#环境下JSON数据如何转化为对象数据.

这个例子中的方法也很简单.但是,我将使用格式化后的json字符串来演示如何将其转化为对象.

注意

你可以使用任何你能获取到的格式化后的json值,可以从文件,网络数据,web API和其他资源中获取.为了简单,我将使用一个字符串变量来表示这个值.

使用到的简单的Json数据如下所示:

第 21 段(可获 4.25 积分)
string data = "{\"ID\": 123,\"Name\": \  
"Afzaal Ahmad Zeeshan\",\"Gender\":   
true, \"DateOfBirth\": \"1995-08-29T00:00:00\"}";  
I used the following code to deserialize the JSON document.  
    // Serialize it.  
Person obj = JsonConvert.DeserializeObject < Person > (data);  
  
// Print on the screen.  
Console.WriteLine(obj.ID);  

这是需要注意的是:DeserializeObject方法有两个版本

  1. 泛型版本.
  2. 通用版本.

如果你使用泛型版本, 在C#中将根据属性动态的创建对象. 如下代码便是:

第 22 段(可获 0.65 积分)
dynamic obj = JsonConvert.DeserializeObject(data);  
  
Console.WriteLine(obj.ID);  

如果用动态主键,它允许你绕过编译期的检查,并允许你在稍后获取ID属性.在你不想创建对象与反序列化时这将会很方便

当然我用的这个版本稍微有些不同.我使用尖括号传递了一个类型参数,Json.NET反序列化JSON对象并为我们构造了对象.我们也可以包含数组对象,程序在迭代集合时将更有说服力,首先我们需要将JSON解析为数组对象,然后才接着往下走.这将会帮我减少代码,并做一些必要的检查

第 23 段(可获 1.6 积分)
var listOfObjects = JsonConvert.DeserializeObject<List<Person>>(data);

注意我传入的List<>对象,类库会将内容转换到List集合对象,然后我们可以对集合做迭代.

异常信息

有几个异常我需要说明一下,这将会帮你理解JSON是怎样工作的. 后续如果收集到更多关于这个主题的,将会更新到这里.

类型不匹配

如果你尝试将JSON对象(单个对象)反序列化到一个(数组)类型,类库将会抛出异常,所以请做如下操作,

第 24 段(可获 1.3 积分)
  1. 要么确定要转换的类型。 要么,

  2. 不要转换为范型传递类型,而是使用动态关键字反序列化对象,然后在运行时检查其类型。 这仍然不能保证它有效。

我的建议

最后,我想给你一些我自己的个人经验提示。 在我的经验中,我开始使用数据库系统上的数据; 我记得是SQL Server CE。 但后来我不得不创建一个需要复杂结构,不会持续疲软的应用程序。 所以在这样的条件下,使用数据库表不是一个好主意。 相反,我不得不使用一个示例和临时数据源。 在那些日子里,在我的同行中,XML是一个流行的框架。 对JSON一点都不知道。 所以,以我的拙见,你应该在那里使用JSON,

第 25 段(可获 1.9 积分)
  1. 数据需要被跨平台,跨浏览器,跨服务器共享.数据库可能会很好用,尽管它们需要序列化等诸如此类.
  2. 你只需要测试这些.你可以将Model应用于JSON解析器, 然后在发布模式下改变他们指向到真实的数据源.

那不是它,  JSON 的大小是 “令人惊讶地”, 与XML相比它非常紧凑. 例如这个例子,让我们一起来看看,

// JSON  
{  
    "name": "Afzaal Ahmad Zeeshan",  
    "age": 20,  
    "emptyObj": {}  
}  

 

// XML  
<  
? xml version = "1.0"  
encoding = "UTF-8" ? >  
    <name > Afzaal Ahmad Zeeshan < /name>   
    <age > 20 < /age>   
    <emptyObj / >  
第 26 段(可获 0.89 积分)

尽管在这个示例中,JSON内部并没有其它信息, XML是有声明的那一行. 而另外一个问题来了,就像发送一个数组,或发送原始类型的对象.在JSON中你可以使用这个,

true

在 XML中, 你并没有许多 “true” 类型. 所以, 你需要发送附加信息. 在网络传输时,它可能产生瓶颈.我已经写了许多文章,博客和指南,并且大部分都是基于JSON,如果没有就是基于SQL Server.

第 27 段(可获 1.15 积分)

文章评论