C#操作JSON和JSON的基础知识

JSON

1. 什么是JSON

  1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  2. JSON 是轻量级的文本数据交换格式
  3. JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台
  4. JSON 具有自我描述性,更易理解(JSON 是基于Javascript的对象进行描述的, 它的每一组值都是键值对组成,它的键就是相当于描述对象的属性,我们可以很好的通过键来看到它表述的是什么意思,所以Json具有自我描述性,也很容易被理解)

2.JSON语法

2.1 JSON 是基于Javascript对象字面量

  1. JSON 基于Javascript 对象字面量(对象中可能包括函数,但是,JSON 的核心就是交换数据,所以不包括函数)中表示属性的语法
  2. 这种属性的表示法是通过键—值来实现的。
  3. 字面量:指字面意思与其想要表达的意思是完全一致的值。
  4. 键—值:指拥有名称和对应的值的属性

2.2 JSON 语法

  1. 在JSON键值对中,键始终被双引号包裹

  2. 在JSON键值对中,值可以是字符串、数字、布尔值、null、对象、或者数组。

  3. JSON中的键值对被花括号包裹。

  4. 在JSON中,多个键值对之间使用逗号分隔。

  5. JSON语法就是告诉机器怎么去读取数据的

    1. { (左花括号) 指 开始读取对象
    2. } (右花括号) 指 结束读取对象
    3. [ (左方括号) 指 开始读取数组
    4. ] (右方括号) 指 结束读取数组
    5. : (冒号) 在键值对中分隔键和值
    6. , (逗号) 用来分隔键值对 或者 数组中的值,也可以认为是一个新的开始
  6. JSON 文件的文件类型是 .json

  7. 当你在传输数据的时候你要告诉对方你传输的是什么数据类型,这个时候就要使用媒体类型了,JSON 文本的 MIME 类型是 application/json

3. JSON数据类型

3.1 JSON数据类型介绍

  1. 对象
  2. 字符串
  3. 数字
  4. 布尔值
  5. null
  6. 数组

3.2 对象类型

  1. JSON也是一个对象,一个被花括号包裹的名称。JSON是JavaScript的子集,可以使用Javascript 访问对象的方式进行访问JSON对象,可以使用打点的方式或中括号的方式进行访问。

  2. 对象类型是使用逗号分隔的名称-值对构成的集合,并使用花括号进行({})包裹。

  3. 实例:

    var myobj={ "name":"runoob", "alexa":10000, "site":null }
    
    /*-----访问对象值------*/
    var x=myobj.name; // 打印出runoob
    var y=myobj["name"]; //打印出runoob
    
    /*-----循环对象------*/
    //使用for-in 来循环对象的属性
    for(var item in myobj)
    {
        console.log(item.toString());
    }
    
    
  4. 嵌套Json值

    var myObj = {
        "name":"runoob",
        "alexa":10000,
        "sites": {
            "site1":"www.runoob.com",
            "site2":"m.runoob.com",
            "site3":"c.runoob.com"
        }
    }
    
    //访问值
    x = myObj.sites.site1;
    x = myObj.sites["site1"];
    
    //修改值
    myObj.sites.site1 = "www.google.com";
    myObj.sites["site1"] = "www.google.com";
    
    /*删除对象属性,使用delete关键字来删除Json对象的属性*/
    delete myObj.sites.site1;
    delete myObj.sites["site1"]
    

3.3 数组类型

  1. 定义数组类型

    JSON 数组是值的集合或者列表,每个值都可以是字符串、数字、布尔值、对象或者数组中的任何一种,数组必须使用方括号([])包裹,且值与值之间用逗号隔开

    [ "Google", "Runoob", "Taobao" ]
    
  2. 注意事项

    1. JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
    2. JSON数组中的数据类型可以不是同一种
  3. 实例

    var myobj={
    "name":"网站",
    "num":3,
    "sites":[ "Google", "Runoob", "Taobao" ]
    }
    //访问Json数组,我们可以像访问JS数组一样使用下标进行访问
    x = myObj.sites[0];
    
    //循环数组,使用for-in访问
    for (var item in myObj.sites) {
      console.log(item);
    }
    //或者使用for循环
    for (i = 0; i < myObj.sites.length; i++) {
         console.log(myObj.sites[i]);
    }
    
  4. 嵌套JSON对象中的数组

    /*JSON 对象中数组可以包含另外一个数组,或者另外一个 JSON 对象*/
    
    var myObj = {
        "name":"网站",
        "num":3,
        "sites": [
            { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] },
            { "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] },
            { "name":"Taobao", "info":[ "淘宝", "网购" ] }
        ]
    }
    
    //使用for-in访问嵌套数组
    for (i in myObj.sites) {
        console.log(myObj.sites[i].name);
    
    for (j in myObj.sites[i].info) {
           console.log (myObj.sites[i].info[j]);
        }
    }
    
    
    
    //修改数组值,使用下标来修改数组
    myObj.sites[1] = "Github";
    
    //使用delete关键字来删除数组的值
    delete myObj.sites[1];
    

3.4 字符串类型

  1. JSON中的字符串类型
    • 一个字符串值,如:“ssr”,使用双引号包裹

3.5 布尔类型

  1. JSON中的布尔类型
    • true 或false
    • JSON中布尔类型只有true和false,且所有字母必须小写

3.6 数字类型

  1. JSON中的数字类型
    • 一个数字值,如42,可以是正整数、负整数、小数或指数

3.7 null类型

  1. JSON中的null类型
    • Javascript中undefined是在尝试获取一些不存在的对象或者变量时返回的结果
    • 在Javascript中,undefined与那些声明的名称和值都不存在的对象或变量有关,而null则仅仅与对象或变量的值有关。
    • null表示一个“没有的值”,在Json中null必须使用小写。

4.JSON 转换

4.1. eval() 函数介绍

  1. 通常我们从服务器收到的消息都是一个字符串,我们要将字符串转为一个JSON对象,eval()可以很好的实现这个功能。

  2. eval() 函数的问题是,它会将传入的字符串会无差别的执行。如果在字符串添加了恶意代码这会造成不可挽回的损失。

  3. 实例

    var jsonString="alert('this is bad')";
    var myObjecr=eval("("+jsonString+")");
    //这个时候会执行alert('this is bad');
    
  4. 为了解决这个问题,推出了JSON解析器,使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法。JSON 解析器只能识别 JSON 文本,而不会编译脚本。

4.2.JSON解析器中的函数

4.2.1 JSON.parse() 函数
  1. JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JSON 对象。

  2. 语法

    JSON.parse(text[, reviver])
    
    参数说明:
    
    text:必需, 一个有效的 JSON 字符串。
    reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
    
  3. 实例

    // 从服务器收到的JSON字符串
    { "name":"runoob", "alexa":10000, "site":"www.runoob.com" }
    
    //将一个JSON字符串转为一个JSON对象
    var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
    
4.2.2 JSON.stringify() 函数
  1. JSON 通常用于与服务端交换数据。在向服务器发送数据时一般是字符串。我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。

  2. 语法

    JSON.stringify(value[, replacer[, space]])
    
    参数说明:
    
    value:
    必需, 要转换的 JavaScript 值(通常为对象或数组)。
    
    replacer:
    可选。用于转换结果的函数或数组。
    
    如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
    
    如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
    
    space:
    可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。
    
  3. 实例

    var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"};
    
    //转为Json字符串
    var myJSON = JSON.stringify(obj);
    
  4. 注意事项:

    1. JSON 不能存储Date类型的数据,JSON.stringify() 会将所有日期转换为字符串
    2. JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value

5. 服务端的JSON

5.1 C#序列化 JSON和反序列化JSON

  1. 在web开发的过程中,经常使用数据交换格式就是JSON
  2. 在C#中操作JSON并不像JavaScript中的那么简单,我们必须要引入一个第三方库NewtonSoft 来帮助我们解析JSON
  3. 在第三方库中提供了两个方法JsonConvert.SerializeObject 和JsonConvert.DeserializeObject 来对对象进行序列化和反序列化。
  4. 使用这个两个方法的时候需要创建对应的实体类,如果是值就可以不必创建了。
5.1.1 序列化JSON
//新建一个user的实体类
 class User
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public  string Sex { get; set; }
    }
    
 //序列化对象
 
  static void Main(string[] args)
        {
            List<User> users = new List<User>();

            for (int i=0;i<10;i++)
            {
                User user = new()
                {
                    Name = "张三" + i,
                    Sex = i % 2 == 0 ? "男" : "女",
                    Age = 21 + i
                };
                users.Add(user);
            }

            //序列化对象
            string str= JsonConvert.SerializeObject(users);

            Console.WriteLine(str);
        }

/*--------------------输出结果-------------------*/
[{"Name":"张三0","Age":21,"Sex":"男"},{"Name":"张三1","Age":22,"Sex":"女"},{"Name":"张三2","Age":23,"Sex":"男"},{"Name":"张三3","Age":24,"Sex":"女"},{"Name":"张三4","Age":25,"Sex":"男"},{"Name":"张三5","Age":26,"Sex":"女"},{"Name":"张三6","Age":27,"Sex":"男"},{"Name":"张三7","Age":28,"Sex":"女"},{"Name":"张三8","Age":29,"Sex":"男"},{"Name":"张三9","Age":30,"Sex":"女"}]

5.1.2 反序列化JSON
//将上面的转换的JSON字符串转为一个对象列表

static void Main(string[] args)
        {
            List<User> users = null;

            string str = "[{\"Name\":\"张三0\",\"Age\":21,\"Sex\":\"男\"},{\"Name\":\"张三1\",\"Age\":22,\"Sex\":\"女\"},{\"Name\":\"张三2\",\"Age\":23,\"Sex\":\"男\"},{\"Name\":\"张三3\",\"Age\":24,\"Sex\":\"女\"},{\"Name\":\"张三4\",\"Age\":25,\"Sex\":\"男\"},{\"Name\":\"张三5\",\"Age\":26,\"Sex\":\"女\"},{\"Name\":\"张三6\",\"Age\":27,\"Sex\":\"男\"},{\"Name\":\"张三7\",\"Age\":28,\"Sex\":\"女\"},{\"Name\":\"张三8\",\"Age\":29,\"Sex\":\"男\"},{\"Name\":\"张三9\",\"Age\":30,\"Sex\":\"女\"}]";
            //反序列化对象,从上面的值可以看出来,我们这是一个JSON数组,
            //数组里面每一个元素都是一个User对象,所以他应该转为一个user数组对象,
            //也可以使用list进行接收,如果是一个对象的应该转为一个User对象

            users = JsonConvert.DeserializeObject<List<User>>(str);


            foreach (var item in users)
            {
                Console.WriteLine(item);
            }
        }

5.2 Linq to JSON

  1. Linq to Json是用来快速操作json对象的,包括:查询,修改和创建操作

  2. 一些相关的类

    类名说明
    JObject用于操作JSON对象
    JArray用于操作JSON数组
    JProPerty表示对象中的属性,以key/value形式表示
    JToken用于存放Linq to Json查询后的结果
  3. 常见方法

    方法说明
    JObject.Parse(string json)将一个json字符串转为一个JObject对象,通过[" 属性名 "]去访问值
    JObject.FromObject (object o)将一个对象转换为一个JObject对象
    JArray.Parse(string json)将一个json字符串转为一个JArray对象,通过下标去访问数组中的值
  4. 上面两个方法虽然也能操作JSON,但是他必须创建对应的实体类,Linq to JSON 可以不创建实体类就去操作JSON

  5. 实例

    
    string json = "{\"Name\":\"wolfy\",\"Age\":25,\"Colleagues\":[{\"Name\":\"Tom\",\"Age\":24},{\"Name\":\"Jack\",\"Age\":22}]}";
     //将json转换为JObject
      JObject jobj = JObject.Parse(json);
      //通过属性名或者索引来访问,只访问了Colleagues之外的Age属性的值,而不是所有的Age的值
      JToken ageToken = jobj["Age"];
      
      //修改  
      jobj["Age"] = 26;
     
      //删除
      jobj.Remove("Colleagues");
    
      Console.WriteLine(ageToken.ToString());
    
  6. 实例

     static void Main(string[] args)
            {
                string str = "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]";
    
                JArray jArray = JArray.Parse(str);
               
                //添加
                jArray.Add(100);
                //修改
                jArray[0] = 10;
                //删除
               Console.WriteLine(jArray.Remove(jArray[0]));
                //查询
                JToken value= jArray[2];
                Console.WriteLine(value.ToString());
    
                //遍历
                foreach (var item in jArray) 
                {
                    Console.WriteLine(item.ToString());
                }
    
            }
    
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值