Json的简介

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

                                                                    来自百度百科的介绍

Json的优点

  • 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小
  • 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
  • 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
  • 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
  • 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

传统操作Json

很多.NET开发程序员或多或少都会遇到操作Json字符串的情况,一般来说,我们都是先定义一个和Json格式相匹配的类,然后将json字符串反序列化成对象,这样便于我们编程使用,由于.NET是强类型语言,Json又是多变的,非常灵活的,导致服务器端定义的json序列化类越来越多,操作也及其不便。特别是对多层嵌套的json更是头疼。此次不再过多声明,.NET程序员用过都明白。

简易操作Json

DynamicJson是专门为.NET程序员开发的Json操作库,其源码非常简单,仅仅只有400行代码,一个对应的class类,目前只支持.NET 4.0以上的.NET Framework。

如何在项目中使用DynamicJson

  • 直接通过Nuget安装
1
PM > Install-Package DynamicJson
  • 下载DynamicJson.dll,然后在项目中添加引用,下载地址如下:
1
http://dynamicjson.codeplex.com/

读取、获取

1
2
3
4
5
6
7
// 将Json字符串解析成DynamicJson对象
var json = DynamicJson.Parse(@"{""foo"":""json"", ""bar"":100, ""nest"":{ ""foobar"":true } }");
 
var r1 = json.foo; // "json" - string类型
var r2 = json.bar; // 100 - double类型
var r3 = json.nest.foobar; // true - bool类型
var r4 = json["nest"]["foobar"]; // 还可以和javascript一样通过索引器获取

  

判断,新增,更新,删除,替换,还可以输出新的Json字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 将Json字符串解析成DynamicJson对象
            var json = DynamicJson.Parse(@"{""foo"":""json"", ""bar"":100, ""nest"":{ ""foobar"":true } }");
 
            // 判断json字符串中是否包含指定键
            var b1_1 = json.IsDefined("foo"); // true
            var b2_1 = json.IsDefined("foooo"); // false
            // 上面的判断还可以更简单,直接通过json.键()就可以判断
            var b1_2 = json.foo(); // true
            var b2_2 = json.foooo(); // false;
 
 
            // 新增操作
            json.Arr = new string[] { "NOR""XOR" }; // 新增一个js数组
            json.Obj1 = new { }; // 新增一个js对象
            json.Obj2 = new { foo = "abc", bar = 100 }; // 初始化一个匿名对象并添加到json字符串中
 
            // 删除操作
            json.Delete("foo");
            json.Arr.Delete(0);
            // 还可以更简单去删除,直接通过json(键); 即可删除。
            json("bar");
            json.Arr(1);
 
            // 替换操作
            json.Obj1 = 5000;
 
            // 创建一个新的JsonObject
            dynamic newjson = new DynamicJson();
            newjson.str = "aaa";
            newjson.obj = new { foo = "bar" };
 
            // 直接序列化输出json字符串
            var jsonstring = newjson.ToString(); // {"str":"aaa","obj":{"foo":"bar"}}

  

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
// 直接遍历json数组
           var arrayJson = DynamicJson.Parse(@"[1,10,200,300]");
           foreach (int item in arrayJson)
           {
               Console.WriteLine(item); // 1, 10, 200, 300
           }
 
           // 直接遍历json对象
           var objectJson = DynamicJson.Parse(@"{""foo"":""json"",""bar"":100}");
           foreach (KeyValuePair<string, dynamic> item in objectJson)
           {
               Console.WriteLine(item.Key + ":" + item.Value); // foo:json, bar:100
           }

  

转换和反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class FooBar
        {
            public string foo { getset; }
            public int bar { getset; }
        }
 
var arrayJson = DynamicJson.Parse(@"[1,10,200,300]");
            var objectJson = DynamicJson.Parse(@"{""foo"":""json"",""bar"":100}");
 
            // 将json数组转成C#数组
            // 方法一:
            var array1 = arrayJson.Deserialize<int[]>();
            // 方法二
            var array2 = (int[])arrayJson;
            // 方法三,这种最简单,直接声明接收即可,推荐使用
            int[] array3 = arrayJson;
 
            // 将json字符串映射成C#对象
            // 方法一:
            var foobar1 = objectJson.Deserialize<FooBar>();
            // 方法二:
 
            var foobar2 = (FooBar)objectJson;
            // 方法三,这种最简单,直接声明接收即可,推荐使用
            FooBar foobar3 = objectJson;
 
            // 还可以通过Linq进行操作
            var objectJsonList = DynamicJson.Parse(@"[{""bar"":50},{""bar"":100}]");
            var barSum = ((FooBar[])objectJsonList).Select(fb => fb.bar).Sum(); // 150
            var dynamicWithLinq = ((dynamic[])objectJsonList).Select(d => d.bar);

  

序列化成json字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 声明一个匿名对象
           var obj = new
           {
               Name = "Foo",
               Age = 30,
               Address = new
               {
                   Country = "Japan",
                   City = "Tokyo"
               },
               Like = new[] { "Microsoft""Xbox" }
           };
           // 序列化
           // {"Name":"Foo","Age":30,"Address":{"Country":"Japan","City":"Tokyo"},"Like":["Microsoft","Xbox"]}
           var jsonStringFromObj = DynamicJson.Serialize(obj);
 
           // 还支持直接序列化数组,集合
           // [{"foo":"fooooo!","bar":1000},{"foo":"orz","bar":10}]
           var foobar = new FooBar[] {
               new FooBar { foo = "fooooo!", bar = 1000 },
               new FooBar { foo = "orz", bar = 10 }
           };
           // 序列化
           var jsonFoobar = DynamicJson.Serialize(foobar);

  

生成xml字符串

1
2
var obj = DynamicJson.Parse(@"{""tes"":10,""nest"":{""a"":0}");
var xmlStr=obj.xml;

  

其他(冲突问题,编译不通过问题)

1
2
3
4
5
6
7
8
9
var nestJson = DynamicJson.Parse(@"{""tes"":10,""nest"":{""a"":0}");
 
            nestJson.nest(); // 判断是否存在nest属性
            nestJson.nest("a"); // 删除nest属性中的a属性
 
            // 处理json中的键和C#的类型冲突导致编译失败,或语法提示错误,只需要在前面加@前缀即可
            var json = DynamicJson.Parse(@"{""int"":10,""event"":null}");
            var r1 = json.@int// 10.0
            var r2 = json.@event// null

  

例子一:TwitterAPI

1
2
3
4
5
6
7
8
9
10
static void Main()
{
    var publicTL = new WebClient().DownloadString(@"http://twitter.com/statuses/public_timeline.json");
    var statuses = DynamicJson.Parse(publicTL);
    foreach (var status in statuses)
    {
        Console.WriteLine(status.user.screen_name);
        Console.WriteLine(status.text);
    }
}

  

例子二:TwitterAPI2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void Main(string[] args)
{
    var wc = new WebClient();
    var statuses = Enumerable.Range(1, 5)
        .Select(i =>
            wc.DownloadString("http://twitter.com/statuses/user_timeline/neuecc.json?page=" + i))
        .SelectMany(s => (dynamic[])DynamicJson.Parse(s))
        .OrderBy(j => j.id);
 
    foreach (var status in statuses)
    {
        Console.WriteLine(status.text);
    }
}

  

看到这里,是不是觉得很爽,赶快让你的项目集成DynamicJson吧。

Json操作(DynamicJson)的更多相关文章

  1. ASP.NET 里的 JSON操作

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

  2. Newtonsoft.Json 操作 JSON 字符串

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

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

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

  4. JavaScript对json操作小记

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

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

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

  6. C#工具类:Json操作帮助类(转载)

    原文转载自C#工具类:Json操作帮助类_IT技术小趣屋. Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来 ...

  7. 【转载】C#工具类:Json操作帮助类

    Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来简化相应的操作,该工具类中包含以下功能:对象转JSON.数据 ...

  8. 【转】python 历险记(四)— python 中常用的 json 操作

    [转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...

  9. python 历险记(四)— python 中常用的 json 操作

    目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...

随机推荐

  1. IIS7配置asp网站

    An error occurred on the server when processing the URL. Please contact the system administrator. If ...

  2. Spring Bean配置

    Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 ...

  3. Linux下SVN命令

    一下内容转载于:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924.这个总结的很好~ windows ...

  4. wp8.1 Study19:通知

    一.通知形式 在windowsphone系统中,通知有很多中形式,如下图 (Tile磁贴在前一博文已复习过,Badge形式与tile类似) 1.Toast 它主要是利用xml文件来编写的,xml代码如 ...

  5. 在 Apache error_log 中看到多个信息,提示 RSA server certificate CommonName (CN) 与服务器名不匹配(转)

    在 Apache error_log 中看到多个信息,提示 RSA server certificate CommonName (CN) 与服务器名不匹配. Article ID: 1500, cre ...

  6. 简单工厂模式(Simple Factory)

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一 ...

  7. Android SQLiteOpenHelper(一)

    SQLiteOpenHelper api解释: A helper class to manage database creation and version management. You creat ...

  8. UISegmentedControl的详细使用

    当用户输入不仅仅是布尔值时,可使用分段控件(UISegmentedControl).分段控件提供一栏按钮(有时称为按钮栏),但只能激活其中一个按钮.分段控件会导致用户在屏幕上看到的内容发生变化.它们常 ...

  9. CBC和CTR解密模式——C++实现

    利用已经封装好的AES加密算法,实现CBC模式加密和CTR模式加密. (1)CBC解密 如图,CBC模式的解密,步骤主要有三个,首先是拿密文段逐一放到AES解密盒子里面得到一个结果temp(事先要把密 ...

  10. dij单源最短路纯模板

    #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> ...