Json笔记

本文深入探讨了JSON数据交换的特性及其在C#中的应用,对比了JSON与XML在可读性、可扩展性和编码难度方面的差异,并提供了JSON在C#中的序列化与反序列化的实现方式。此外,还展示了如何通过JQuery获取JSON数据并处理数组类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSON(JavaScript Object Notation标记) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于 JavaScriptECMA 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

     JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON的具体形式
1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
2、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
3、value)可以是双引号括起来的字符串string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
4、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。

5、数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

例:

var jsStr="a";//字符串

var jsArr=["a","b","c","d","e"]; //数组

var jsObj = { "cy_companyid": 43, "cy_deptid": 40, "cy_positionid": 100, "cy_position": ["店长", "人事", "财务"] };//对象

var jsObjArr=[

{ "cy_companyid": 43, "cy_deptid": 40, "cy_positionid": 100, "cy_position": "店长" },

 { "cy_companyid": 43, "cy_deptid": 40, "cy_positionid": 101, "cy_position": "店员" },
 { "cy_companyid": 43, "cy_deptid": 40, "cy_positionid": 340, "cy_position": "储备店长" }, 

{ "cy_companyid": 43, "cy_deptid": 40, "cy_positionid": 341, "cy_position": ["店长", "人事", "财务"] }

];//对象的集合,

 

参考:http://www.json.org/json-zh.html

 

JSON与XML的比较
  ◆可读性

  JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

  ◆可扩展性

  XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

  ◆编码难度

  XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

  ◆解码难度

  XML的解析方式有两种:

  一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

  另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

  凡是这样可扩展的结构数据解析起来一定都很困难。

  JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。

  而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

  以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

  ◆实例比较

  XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

  用XML表示中国部分省市数据如下:

  <?xml version="1.0" encoding="utf-8"?>

  <country>

  <name>中国</name>

  <province>

  <name>黑龙江</name>

  <citys>

  <city>哈尔滨</city>

  <city>大庆</city>

  </citys>

  </province>

  <province>

  <name>广东</name>

  <citys>

  <city>广州</city>

  <city>深圳</city>

  <city>珠海</city>

  </citys>

  </province>

  <province>

  <name>台湾</name>

  <citys>

  <city>台北</city>

  <city>高雄</city>

  </citys>

  </province>

  <province>

  <name>新疆</name>

  <citys>

  <city>乌鲁木齐</city>

  </citys>

  </province>

  </country>

  用JSON表示如下:

  {

  name:"中国",

  province:[

  {

  name:"黑龙江",

  citys:{

  city:["哈尔滨","大庆"]

  }

  },

  {

  name:"广东",

  citys:{

  city:["广州","深圳","珠海"]

  }

  },

  {

  name:"台湾",

  citys:{

  city:["台北","高雄"]

  }

  },

  {

  name:"新疆",

  citys:{

  city:["乌鲁木齐"]

  }

  }

  ]

  }

  编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。

  编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。

==========================C#操作Json==========================================================

可以通过JSON序列化与反序列化辅助类来实现交互和转换

using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Text;

/// <summary>
/// JSON序列化与反序列化辅助类
/// </summary>
public class JsonHelper
{
    /// <summary>
    /// 用于把对象data序列化为json格式的字符串
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data"></param>
    /// <returns></returns>
    public static string Serialize<T>(T data)
    {

        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
        using (MemoryStream ms = new MemoryStream())
        {
            serializer.WriteObject(ms, data);
            return Encoding.UTF8.GetString(ms.ToArray());
            //ms.Position = 0;
            //using (StreamReader sr = new StreamReader(ms))
            //{
            //    return sr.ReadToEnd();
            //}
        }
    }
    /// <summary>
    /// 用于把json格式的js对象反序列化为C#中的类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="json"></param>
    /// <returns></returns>
    public static T Deserialize<T>(string json)
    {
        T obj = Activator.CreateInstance<T>();
        using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            return (T)serializer.ReadObject(ms);
        }
    }
}

 

例如:JsonHelper.Serialize(泛型集合);Response.Write(json格式字符串)请求http://localhost/oa/system/Position.ashx?DeptId=40 ,得到的json格式字符串如下:

[{"cy_companyid":43,"cy_deptid":40,"cy_parentid":0,"cy_position":"店

长","cy_positionid":100,"cy_positionpath":"11","cy_sortid":1,"tb_state":"1 "},{"cy_companyid":43,"cy_deptid":40,"cy_parentid":0,"cy_position":"店员","cy_positionid":101,"cy_positionpath":"12","cy_sortid":1,"tb_state":"1 "},{"cy_companyid":43,"cy_deptid":40,"cy_parentid":0,"cy_position":"储备店长","cy_positionid":340,"cy_positionpath":"12","cy_sortid":3,"tb_state":"1 "},{"cy_companyid":43,"cy_deptid":40,"cy_parentid":0,"cy_position":"实习店员","cy_positionid":341,"cy_positionpath":"12","cy_sortid":4,"tb_state":"1 "}]

每循环泛型集合的一个对象,用{"字段":"值","字段":值}键值对用:,多个字段间用,号隔开。多个对象间也用,号隔开{},{}

前台可以用Jquery的getJSON方法获取到json格式数据,和ajax获取到js数组,然后处理js数组类似。

$.getJSON("Position.ashx?CompId=" + CompId + "", function (data) {
                        $.each(data, function (i, json) {
                            //append追加内容到dom元素内部; attr设置属性并赋值。[没有,添加属性;有,修改属性值]
                            var $option = $("<option/>").append(json.dept_name).attr("value", json.dept_id);
                            $dropDep.append($option);
                        });
                    });

json.dept_name,通过js对象访问。

 

从结构上看,所有js数据类型(data)最终都可以分解成三种类型

第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。

第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。

第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。

我恍然大悟,数据构成的最小单位原来如此简单!难怪在编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。

2.

我马上想到了json

21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。

Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。

1) 并列的数据之间用逗号(",")分隔。

2) 映射用冒号(":")表示。

3) 并列数据的集合(数组)用方括号("[]")表示。

4) 映射的集合(对象)用大括号("{}")表示。

上面四条规则,就是Json格式的所有内容。

另外,使用JSON解析器,可以参考 http://www.yiiyaa.net/1161
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值