JSON 是存储和交换文本信息的语法。类似 XML。

JSON 比 XML 更小、更快,更易解析。JSON跟XML一样是一种是数据格式。

JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

JSON 语法规则

数据在键值对中     数据由逗号分隔     花括号保存对象     方括号保存数组

JSON 数据的书写格式是:名称/值对。 名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:"firstName":"John"

JSON 值可以是: 数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在方括号中) 对象(在花括号中) null

JSON数据结构

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key (c# 对象[key])获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

经过对象、数组2种结构就可以组合成复杂的数据结构了。

学习可以使用json的官网:http://www.json.org/

在前面我们解析XML文本的时候,使用的是自带的XmlDocument,在这里解析json文本的时候,需要我们自己下载所需的库文件。在官网中,C#下解析的方式很多,我们一般选用Litjson。有两种引用litjson的方法:

(1)去litjson的网站下载litjson.dll 然后添加引用 找到dll所在目录

(2)右键项目的引用,选择NuGet程序包,在联机中搜索litjson安装

解析数组

下面我们解析一段json格式的文本,这个文本表示的是一个数组

[
{"id":2,"name":"天下无双","damage":123 },
{"id":3,"name":"天下无贼","damage":21 },
{"id":4,"name":"咫尺天涯","damage":900 }
]

首先定义一个Skill类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _032_json操作 {
class Skill
{
public int id;
public int damage;
public string name; public override string ToString()
{
return string.Format("Id: {0}, Damage: {1}, Name: {2}", id, damage, name);
}
}
}

解析:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LitJson; namespace _032_json操作 {
class Program {
static void Main(string[] args) {
List<Skill> skillList = new List<Skill>();
//我们使用jsonMapper去解析json文本
//jsondata代表一个数组或者一个对象
//在这里jsonData代表数组
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt"));
foreach (JsonData temp in jsonData)//在这里temp代表一个对象
{
Skill skill = new Skill();
JsonData idValue = temp["id"]; //通过字符串索引器可以取得键值对的值
JsonData nameValue = temp["name"];
JsonData damageValue = temp["damage"];
int id = Int32.Parse(idValue.ToString());
int damage = Int32.Parse(damageValue.ToString());
//Console.WriteLine(id+":"+nameValue.ToString()+":"+damage);
skill.id = id;
skill.damage = damage;
skill.name = nameValue.ToString();
skillList.Add(skill);
}
foreach (var temp in skillList)
{
Console.WriteLine(temp);
} Console.ReadKey();
}
}
}

输出结果:

除了上面的方法,更简单是使用泛型来解析,但是json里面对象的键必须和定义的类里面的字段或者属性保持一致

Skill[] skillArray = JsonMapper.ToObject<Skill[]>(File.ReadAllText("json技能信息.txt"));
foreach (var temp in skillArray)
{
Console.WriteLine(temp);
}

或者写成

List<Skill> skillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("json技能信息.txt"));
foreach (var temp in skillList)
{
Console.WriteLine(temp);
}

解析对象

上面解析的是一个数组,下面我们解析一个对象:

{
"Name":"siki",
"Level":99,
"Age":18,
"SkillList":[
{"id":2,"name":"天下无双","damage":123 },
{"id":3,"name":"天下无贼","damage":21 },
{"id":4,"name":"咫尺天涯","damage":900 }
]
}

定义类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _032_json操作 {
class Player
{
public string Name { get; set; }
public int Level { get; set; }
public int Age { get; set; }
public List<Skill> SkillList { get; set; } public override string ToString()
{
return string.Format("Name: {0}, Level: {1}, Age: {2}, SkillList: {3}", Name, Level, Age, SkillList);
}
}
}

解析:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LitJson; namespace _032_json操作 {
class Program {
static void Main(string[] args) {
Player p = JsonMapper.ToObject<Player>(File.ReadAllText("主角信息.txt"));
Console.WriteLine(p);
foreach (var temp in p.SkillList)
{
Console.WriteLine(temp);
}
Console.ReadKey();
}
}
}

输出结果:

反解析

我们进行数据传递的时候,将数据做成json格式以便传输

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LitJson; namespace _032_json操作 {
class Program {
static void Main(string[] args) {
Player p = new Player();
p.Name = "花千骨";
p.Level = 100;
p.Age = 16;
string json = JsonMapper.ToJson(p);
Console.WriteLine(json);
Console.ReadKey();
}
}
}

输出结果:

C#编程 JSON操作的更多相关文章

  1. jquery css事件编程 位置 操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Json操作(DynamicJson)

    Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...

  3. 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧

    看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...

  4. ASP.NET 里的 JSON操作

    最近项目中需要用到 JSON操作,google了一下 找到了几个比较好的操作方法.... 一 .使用 mircosoft 提供的 .NET Framework 自带的 json操作方法 1. 使用Ja ...

  5. NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别

    NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...

  6. Newtonsoft.Json 操作 JSON 字符串

    Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSeriali ...

  7. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  8. JavaScript对json操作小记

    JSON是一种轻量级的数据交换格式,同时,JSON是 JavaScript 原生格式,因此我们可以直接处理它不需要依赖任何工具包或者插件.因此,好多后台都会选择返回给前端这种非常友好的数据格式. 引子 ...

  9. 微信小程序setData()方法的详解以及对数组/json操作

    此篇文章是本人对setData方法的一些理解,是查阅文档和查找一些其他资料综述的,有所不足希望指正! 直接进入正题! 一.setData()方法: 1.参数接受一个对象,以key,value的形式表示 ...

随机推荐

  1. AutoFac控制反转

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  2. Java 对象序列化和反序列化 (实现 Serializable 接口)

    序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.  把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

  3. Python3之文件读写操作详解

    文件操作的步骤: 打开文件 -> 操作文件 -> 关闭文件 切记:最后要关闭文件(否则可能会有意想不到的结果) 打开文件 文件句柄 = open('文件路径', '模式') 指定文件编码 ...

  4. 题解 【NOIP2011】计算系数

    [NOIP2011]计算系数 Description 给定一个多项式 (ax+by)^k ,请求出多项式展开后 x^n * y^m 项的系数. Input 共一行,包含 5 个整数,分别为 a,b,k ...

  5. Python之asyncio模块的使用

    asyncio模块作用:构建协程并发应用的工具 python并发的三大内置模块,简单认识: .multiprocessing:多进程并发处理 .threading模块:多线程并发处理 .asyncio ...

  6. Sogou for Linux

    造冰箱的大熊猫,本文适用于Ubuntu 18.04@cnblogs 2019/5/8 在Ubuntu(安装时选择英文语言环境)下安装搜狗输入法 1)从搜狗官网下载sogou拼音输入法的deb安装包. ...

  7. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)H

    题面 被神葱安利安利了本题. 我们贪心的想,如果有那么一坨相等的学号,那么肯定是保留一个人学号不变,其余的再推到学号+1的位置(准备与那个位置的其他人合并)处理. 虽然a[i]可大至1e18,不过如果 ...

  8. Centos 7 下安装LDAP 双主同步

    Centos 7 下安装LDAP 双主同步 标签(空格分隔): LDAP 安装说明: 从OpenLDAP2.4.23版本开始所有配置数据都保存在slapd.d目录下的cn=config文件夹中,不再使 ...

  9. Xargs用法详解(自创)

    简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的find /sbin -perm +700 |ls -l ...

  10. Travis-CI自动化测试并部署至自己的CentOS服务器

    一直都想自己部署一下自动化测试部署,在了解了Travis-CI之后终于准备在这次和小伙伴一起做的一个博客类网站实验下了. 因为这是一个前后端分离的项目,所以我这里只管前端工程的自动化部署,前端主要用V ...