• [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)【转】


    在Json.NET开源的组件的API文档中看到其中有个Linq To Json基本操作.详细看了其中API 中Linq to SQL命名空间下定义类方法.以及实现, 觉得参与Linq 来操作Json从某种程度上提高生成Json字符窜的效率, 特别对数据库中批量的数据. 但是也从侧面也增加程序员编码的难度(如果刚用不熟练情况下 主要是在编码中控制生成Json字符窜正确的格式),另外一个关键借助了Linq对Json数据操作和转换更加直接.Linq To SQL 空间目的使用户利用Linq更加直接创建和查询Json对象. 翻译文档如下:

    A:Creating Json-(利用Linq快速创建Json Object)

    Newtonsoft.Json.Linq 空间下有多个方法可以创建一个Json对象. 简单方法虽然能够创建,但是对编码而言较多略显累赘.简单创建代码如下:

    复制代码
     1 JArray array = new JArray();
     2 JValue text = new JValue("Manual text");
     3 JValue date = new JValue(new DateTime(2000523));
     4  
     5 array.Add(text);
     6 array.Add(date);
     7  
     8 string json = array.ToString();
    10 //生成的Json字符窜如下:
    11 // [
    12 //   "Manual text",
    13 //   "/Date(958996800000+1200)/"
    14 // ]
    复制代码

    JArray是Newtonsoft.Json.Linq空间扩展的类表示一个Json数组.而JValue代表JSON值(字符串,整数,日期等) .

    简单利用Linq To SQL创建一个Json Object:

    复制代码
     1 List<Post> posts = GetPosts();
     2  
     3 JObject rss =
     4   new JObject(
     5     new JProperty("channel",
     6       new JObject(
     7         new JProperty("title""James Newton-King"),
     8         new JProperty("link""http://james.newtonking.com"),
     9         new JProperty("description""James Newton-King's blog."),
    10         new JProperty("item",
    11           new JArray(
    12             from p in posts
    13             orderby p.Title
    14             select new JObject(
    15               new JProperty("title", p.Title),
    16               new JProperty("description", p.Description),
    17               new JProperty("link", p.Link),
    18               new JProperty("category",
    19                 new JArray(
    20                   from c in p.Categories
    21                   select new JValue(c)))))))));
    22  
    23 Console.WriteLine(rss.ToString());
    24 //生成的Json字符窜如下:
    25 //{
    26 //  "channel": {
    27 //    "title": "James Newton-King",
    28 //    "link": "http://james.newtonking.com",
    29 //    "description": "James Newton-King's blog.",
    30 //    "item": [
    31 //      {
    32 //        "title": "Json.NET 1.3 + New license + Now on CodePlex",
    33 //        "description": "Annoucing the release of Json.NET 1.3, the MIT license and the source being available on CodePlex",
    34 //        "link": "http://james.newtonking.com/projects/json-net.aspx",
    35 //        "category": [
    36 //          "Json.NET",
    37 //          "CodePlex"
    38 //        ]
    39 //      },
    40 //      {
    41 //        "title": "LINQ to JSON beta",
    42 //        "description": "Annoucing LINQ to JSON",
    43 //        "link": "http://james.newtonking.com/projects/json-net.aspx",
    44 //        "category": [
    45 //          "Json.NET",
    46 //          "LINQ"
    47 //        ]
    48 //      }
    49 //    ]
    50 //  }
    51 //}
    52 
    复制代码

    分析一下: 如果按照普通方法把一个List集合生成Json对象字符窜.步骤如下: List首先从数据库中取出.然后利用JsonConvert实体类下的SerializeObject()方法实例化才能返回Json字符窜. 相对而言Linq 直接操作数据库数据 一步到位 所以在编程效率上实现提高.

    你可以FromObject()方法从一个非Json类型对象创建成Json Object.(自定义对象):

    复制代码
     1 JObject o = JObject.FromObject(new
     2 {
     3   channel = new
     4   {
     5     title = "James Newton-King",
     6     link = "http://james.newtonking.com",
     7     description = "James Newton-King's blog.",
     8     item =
     9         from p in posts
    10         orderby p.Title
    11         select new
    12         {
    13           title = p.Title,
    14           description = p.Description,
    15           link = p.Link,
    16           category = p.Categories
    17         }
    18   }
    19 });
    20 
    复制代码

    最后可以通过Pares()方法把一个String字符窜创建一个Json对象:(手写控制Json格式):

    复制代码
     1 string json = @"{
     2   CPU: 'Intel',
     3   Drives: [
     4     'DVD read/writer',
     5     ""500 gigabyte hard drive""
     6   ]
     7 }";
     8  
     9 JObject o = JObject.Parse(json);
    10 
    复制代码

    B:查询Json Object

    当查询一个Json Object属性时最有用方法分别为:Children()方法和Property Index(属性索引),Children()方法将返回Json Object所有的Json子实体. 如果它是一个JObject将返回一个属性集合.如果是JArray返回一个数组值的集合. 但是Property Index用户获得特定的Children子实体.无论是JSON数组索引或JSON对象的属性名的位置.

    复制代码
     1 var postTitles =
     2   from p in rss["channel"]["item"].Children()
     3   select (string)p["title"];
     4  
     5 foreach (var item in postTitles)
     6 {
     7   Console.WriteLine(item);
     8 }
     9  
    10 //LINQ to JSON beta
    11 //Json.NET 1.3 + New license + Now on CodePlex
    12  
    13 var categories =
    14   from c in rss["channel"]["item"].Children()["category"].Values<string>()
    15   group c by c into g
    16   orderby g.Count() descending
    17   select new { Category = g.Key, Count = g.Count() };
    18  
    19 foreach (var c in categories)
    20 {
    21   Console.WriteLine(c.Category + " - Count: " + c.Count);
    22 }
    24 //Json.NET - Count: 2
    25 //LINQ - Count: 1
    26 //CodePlex - Count: 1
    复制代码

    Linq to Json常常用于手动把一个Json Object转换成.NET对象 .

    复制代码
     1 public class Shortie
     2 {
     3   public string Original { getset; }
     4   public string Shortened { getset; }
     5   public string Short { getset; }
     6   public ShortieException Error { getset; }
     7 }
     8  
     9 public class ShortieException
    10 {
    11   public int Code { getset; }
    12   public string ErrorMessage { getset; }
    13 }
    14 
    复制代码

    手动之间的序列化和反序列化一个.NET对象是最常用情况是JSON Object 和需要的。NET对象不匹配情况下.

    复制代码
     1 string jsonText = @"{
     2   ""short"":{
     3     ""original"":""http://www.foo.com/"",
     4     ""short"":""krehqk"",
     5     ""error"":{
     6       ""code"":0,
     7       ""msg"":""No action taken""}
     8 }";
     9  
    10 JObject json = JObject.Parse(jsonText);
    11  
    12 Shortie shortie = new Shortie
    13                   {
    14                     Original = (string)json["short"]["original"],
    15                     Short = (string)json["short"]["short"],
    16                     Error = new ShortieException
    17                             {
    18                               Code = (int)json["short"]["error"]["code"],
    19                               ErrorMessage = (string)json["short"]["error"]["msg"]
    20                             }
    21                   };
    22  
    23 Console.WriteLine(shortie.Original);
    24 // http://www.foo.com/
    25  
    26 Console.WriteLine(shortie.Error.ErrorMessage);
    27 // No action taken
    28 
    复制代码

    个人翻译不是很好,最近主要是用的比较频繁. 今天总结一些基本用法.如想看原版的Linq To Json 编译 请参考官方地址下API,代码如果看不懂可以查看Newtonsoft.Json.Linq命名空间下定义类和集成静待方法或直接联系我.


     /******************************************************************************************
     *【Author】:chenkai
     *【Date】:2013年06月22日
     *【Notice】:
     *1、本文为原创技术文章,首发博客园个人站点(http://www.cnblogs.com/chenkai/archive/2010/01/02/1637704.html),转载和引用请注明作者及出处。
     *2、本文必须全文转载和引用,任何组织和个人未授权不能修改任何内容,并且未授权不可用于商业。
     *3、本声明为文章一部分,转载和引用必须包括在原文中。
     ******************************************************************************************/

  • 相关阅读:
    codeforces 336D Vasily the Bear and Beautiful Strings(组合数学)
    13年山东省赛 The number of steps(概率dp水题)
    13年山东省赛 Mountain Subsequences(dp)
    13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)
    codeforces 337C Quiz(贪心)
    codeforces 336C Vasily the Bear and Sequence(贪心)
    codeforces 335A Banana(贪心)
    codeforces 339C Xenia and Bit Operations(线段树水题)
    codeforces 339C Xenia and Weights(dp或暴搜)
    codeforces 340E Iahub and Permutations(错排or容斥)
  • 原文地址:https://www.cnblogs.com/armyant/p/3149704.html
Copyright © 2020-2023  润新知