iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的Linq to JSON操作详解
  • 750
分享到

C#中的Linq to JSON操作详解

2024-04-02 19:04:59 750人浏览 独家记忆
摘要

目录一、创建JObject and jarrary实例1、手动创建JSON1、创建jsON对象,JObject2、创建JSON数组,JArrary2、使用Linq创建JSON3、从对

Linq to JSON是用来操作JSON对象的,可以用于快速查询、修改和创建JSON对象。

当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部。

参考:Json.net Documentation

在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类.

类名说明
JObject用于操作JSON对象
JArray用语操作JSON数组
JValue表示数组中的值
JProperty表示对象中的属性,以"key/value"形式
JToken用于存放Linq to JSON查询后的结果

一、创建JObject and JArrary实例

1、手动创建JSON

设置值和一次创建一个对象或数组可以让您完全控制,但是它比其他选项更冗长。

1、创建JSON对象,JObject

JObject staff = new JObject();
staff.Add(new JProperty("Name", "Jack"));
staff.Add(new JProperty("Age", 33));
staff.Add(new JProperty("Department", "Personnel Department"));
staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "Tom"), new JProperty("Age", 44), new JProperty("Department", "Personnel Department"))));
Console.WriteLine(staff.ToString());
//返回
//{
//  "Name": "Jack",
//  "Age": 33,
//  "Department": "Personnel Department",
//  "Leader": {
//    "Name": "Tom",
//    "Age": 44,
//    "Department": "Personnel Department"
//  }
//}

2、创建JSON数组,JArrary

JArray arr = new JArray();
arr.Add(new JValue(1));
arr.Add(new JValue(2));
arr.Add(new JValue(3));
Console.WriteLine(arr.ToString());

//返回
//[
//  1,
//  2,
//  3
//]

2、使用Linq创建JSON

使用LINQ声明式地创建JSON对象,是一种从值集合创建JSON的快速方法。

List posts = GetPosts();

JObject rss =
    new JObject(
        new JProperty("channel",
            new JObject(
                new JProperty("title", "James Newton-King"),
                new JProperty("link", "Http://james.newtonking.com"),
                new JProperty("description", "James Newton-King's blog."),
                new JProperty("item",
                    new JArray(
                        from p in posts
                        orderby p.Title
                        select new JObject(
                            new JProperty("title", p.Title),
                            new JProperty("description", p.Description),
                            new JProperty("link", p.Link),
                            new JProperty("cateGory",
                                new JArray(
                                    from c in p.Categories
                                    select new JValue(c)))))))));

Console.WriteLine(rss.ToString());

//{
//  "channel": {
//    "title": "James Newton-King",
//    "link": "http://james.newtonking.com",
//    "description": "James Newton-King\'s blog.",
//    "item": [
//      {
//        "title": "Json.NET 1.3 + New license + Now on CodePlex",
//        "description": "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",
//        "link": "http://james.newtonking.com/projects/json-net.aspx",
//        "category": [
//          "Json.NET",
//          "CodePlex"
//        ]
//      },
//      {
//        "title": "LINQ to JSON beta",
//        "description": "Announcing LINQ to JSON",
//        "link": "http://james.newtonking.com/projects/json-net.aspx",
//        "category": [
//          "Json.NET",
//          "LINQ"
//        ]
//      }
//    ]
//  }
//}

3、从对象创建JSON

JObject.FromObject(object o):o为要转化的对象,返回一个JObject对象

最后一个选项是使用FromObject()方法从非JSON类型创建JSON对象。

下面的示例展示了如何从匿名对象创建JSON对象,但是任何. net类型都可以与FromObject一起创建JSON。

var posts = new[] {
     new {
        Title="Json.NET 1.3 + New license + Now on CodePlex",
        Description= "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",
        Link="http://james.newtonking.com/projects/json-net.aspx",
        Categories=new[]{ "Json.NET","CodePlex"}
    },
     new {
        Title="LINQ to JSON beta",
        Description= "Announcing LINQ to JSON",
        Link="http://james.newtonking.com/projects/json-net.aspx",
        Categories=new[]{ "Json.NET","LINQ"}
    },
};


JObject o = JObject.FromObject(new
{
    channel = new
    {
        title = "James Newton-King",
        link = "http://james.newtonking.com",
        description = "James Newton-King's blog.",
        item =  //返回数组
        from p in posts
        orderby p.Title
        select new   
        {
            title = p.Title,
            description = p.Description,
            link = p.Link,
            category = p.Categories
        }
    }
});

Console.WriteLine(o.ToString());

//{
//  "channel": {
//    "title": "James Newton-King",
//    "link": "http://james.newtonking.com",
//    "description": "James Newton-King\'s blog.",
//    "item": [
//      {
//        "title": "Json.NET 1.3 + New license + Now on CodePlex",
//        "description": "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",
//        "link": "http://james.newtonking.com/projects/json-net.aspx",
//        "category": [
//          "Json.NET",
//          "CodePlex"
//        ]
//      },
//      {
//        "title": "LINQ to JSON beta",
//        "description": "Announcing LINQ to JSON",
//        "link": "http://james.newtonking.com/projects/json-net.aspx",
//        "category": [
//          "Json.NET",
//          "LINQ"
//        ]
//      }
//    ]
//  }
//}

4、解析JSON文本

JObject.Parse(string json):json含有JSON对象的字符串,返回为JObject对象

//解析JSON对象
string json = @"{
  CPU: 'Intel',
  Drives: [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}";

JObject o = JObject.Parse(json);

//解析JSON数组
string json = @"[
  'Small',
  'Medium',
  'Large'
]";

JArray a = JArray.Parse(json);

5、从文件中加载JSON

using (StreamReader reader = File.OpenText(@"c:\person.json"))
{
    JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(reader));
    // do stuff
}

二、使用JsonConvert.DeserializeObject反序列化JOSN片段

1、数组数据

string jsonArrayText= "[{'a','al'.'b','b1'},{'a','a2'.'b','b2'}]";
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText); 

string ja1a==ja[1]["a"].ToString(); 
//或者 
JObject o=(JObject)ja[1]; 
string ja1a=o["a"].ToString();

2、对象格式

siring jsonText= "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}";

JObject jo =(JObject)JsonConvert.DeserializeObject(jsonArrayText);
string zone =jo["beijing"]["zone"].ToString();

三、修改JObject and JArrary实例

string json = @"{  
                 'post':{  
                     'Title':'修改JArray和JObject',  
                     'Link':'http://write.blog.csdn.net',  
                     'Description':'这是一个修改JArray和JObject的演示案例',  
                     'Item':[]  
                 }  
             }";

JObject o = JObject.Parse(json);
JObject post = (JObject)o["post"];

post["Title"] = ((string)post["Title"]).ToUpper();
post["Link"] = ((string)post["Link"]).ToUpper();

post.Property("Description").Remove();

post.Property("Link").AddAfterSelf(new JProperty("New", "新添加的属性"));

JArray a = (JArray)post["Item"];
a.Add("修改JArray");
a.Add("修改JObject");

移除属性

JObject jObj = JObject.Parse(json);
jObj.Remove("Colleagues");//跟的是属性名称
Console.WriteLine(jObj.ToString());

四、查询JObject and JArrary实例

将一个值从LINQ转换为JSON的最简单方法是:使用JObject/JArray上的ItemObject索引,然后将返回的JValue转换为所需的类型。

string json = @"{
  'channel': {
    'title': 'James Newton-King',
    'link': 'http://james.newtonking.com',
    'description': 'James Newton-King\'s blog.',
    'item': [
      {
        'title': 'Json.NET 1.3 + New license + Now on CodePlex',
        'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'CodePlex'
        ]
      },
      {
        'title': 'LINQ to JSON beta',
        'description': 'Announcing LINQ to JSON',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'LINQ'
        ]
      }
    ]
  }
}";

JObject rss = JObject.Parse(json);

string rssTitle = (string)rss["channel"]["title"];
// James Newton-King

string itemTitle = (string)rss["channel"]["item"][0]["title"];
// Json.NET 1.3 + New license + Now on CodePlex

JArray categories = (JArray)rss["channel"]["item"][0]["categories"];
// ["Json.NET", "CodePlex"]

IList<string> categoriesText = categories.Select(c => (string)c).ToList();
// Json.NET
// CodePlex

判断Key是否存在

JToken test = new JObject();

if (test["a"] == null)
{
    Console.WriteLine("键值key不存在!");
}

JObject test1 = test as JObject;
if (test1.Property("a") == null || test1.Property("a").ToString() == "")
{
    Console.WriteLine("键值key不存在!");
}

五、用LINQ表达式进行查询

也可以使用LINQ查询JObject/JArray。

Children()以IEnumerable的形式返回JObject/JArray的子值,然后可以使用标准的Where/OrderBy/Select LINQ操作符查询这些子值。

注意:

Children()返回token的所有子元素。如果它是一个JObject,它将返回一个要使用的属性集合,如果它是一个JArray,您将得到一个数组值的集合。

var postTitles =
    from p in rss["channel"]["item"]
    select (string)p["title"];

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

//LINQ to JSON beta
//Json.NET 1.3 + New license + Now on CodePlex

var categories =
    from c in rss["channel"]["item"].SelectMany(i => i["categories"]).Values<string>()
    group c by c
    into g
    orderby g.Count() descending
    select new { Category = g.Key, Count = g.Count() };

foreach (var c in categories)
{
    Console.WriteLine(c.Category + " - Count: " + c.Count);
}

//Json.NET - Count: 2
//LINQ - Count: 1
//CodePlex - Count: 1

可以使用LINQ to JSON手动将JSON转换为. net对象。

当您处理与. net对象不匹配的JSON时,手动序列化和反序列化. net对象是很有用的。

string jsonText = @"{
  'short': {
    'original': 'http://www.foo.com/',
    'short': 'krehqk',
    'error': {
      'code': 0,
      'msg': 'No action taken'
    }
  }
}";

JObject json = JObject.Parse(jsonText);

Shortie shortie = new Shortie
{
    Original = (string)json["short"]["original"],
    Short = (string)json["short"]["short"],
    Error = new ShortieException
    {
        Code = (int)json["short"]["error"]["code"],
        ErrORMessage = (string)json["short"]["error"]["msg"]
    }
};

Console.WriteLine(shortie.Original);
// http://www.foo.com/

Console.WriteLine(shortie.Error.ErrorMessage);
// No action taken

public class Shortie
{
    public string Original { get; set; }
    public string Shortened { get; set; }
    public string Short { get; set; }
    public ShortieException Error { get; set; }
}

public class ShortieException
{
    public int Code { get; set; }
    public string ErrorMessage { get; set; }
}

六、使用函数SelectToken生成JToken对象可以简化查询语句

1、SelectToken

SelectToken是JToken上的一个方法,它将字符串路径作为子Token名,返回子Token。如果在路径的位置找不到Token,则SelectToken返回空引用。

该路径由属性名和按句点分隔的数组索引组成,例如manufacturer [0]. name。

JObject jObj = JObject.Parse(json);
JToken name = jObj.SelectToken("Name");
Console.WriteLine(name.ToString());

结果:Jack

2、使用LINQ来SelectToken

SelectToken支持JSONPath查询。点击这里了解更多关于JSONPath的信息。

查询最后一名同事的年龄

//将json转换为JObject
JObject jObj = JObject.Parse(json);
var age = jObj.SelectToken("Colleagues[1].Age");
Console.WriteLine(age.ToString());

// manufacturer with the name 'Acme Co'
JToken acme = o.SelectToken("$.Manufacturers[?(@.Name == 'Acme Co')]");

Console.WriteLine(acme);
// { "Name": "Acme Co", Products: [{ "Name": "Anvil", "Price": 50 }] }

// name of all products priced 50 and above
IEnumerable pricyProducts = o.SelectTokens("$..Products[?(@.Price >= 50)].Name");

foreach (JToken item in pricyProducts)
{
    Console.WriteLine(item);
}
// Anvil
// Elbow Grease

结果:29

3、使用JSONPath来SelectToken

SelectToken可以与标准的LINQ方法结合使用。

利用SelectToken来查询所有同事的名字

JObject jObj = JObject.Parse(json);
var names = jObj.SelectToken("Colleagues").Select(p => p["Name"]).ToList();
foreach (var name in names)
    Console.WriteLine(name.ToString());

IList<string> storeNames = o.SelectToken("Stores").Select(s => (string)s).ToList();
// Lambton Quay
// Willis Street

IList<string> firstProductNames = o["Manufacturers"].Select(m => (string)m.SelectToken("Products[1].Name")).ToList();
// null
// Headlight Fluid

decimal totalPrice = o["Manufacturers"].Sum(m => (decimal)m.SelectToken("Products[0].Price"));

结果:Tom Abel

七、如果Json中的Key是变化的但是结构不变,如何获取所要的内容?

例如:

{
    "trends": {
        "2013-05-31 14:31": [
            {
                "name": "我不是谁的偶像",
                "query": "我不是谁的偶像",
                "amount": "65172",
                "delta": "1596"
            },
            {
                "name": "世界无烟日",
                "query": "世界无烟日",
                "amount": "33548",
                "delta": "1105"
            }
        ]
    },
    "as_of": 1369981898
}

其中的"2013-05-31 14:31"是变化的key,如何获取其中的"name","query","amount","delta"等信息呢?
通过Linq可以很简单地做到:

var jObj = JObject.Parse(jsonString);
var tends = from c in jObj.First.First.First.First.Children()
            select JsonConvert.DeserializeObject(c.ToString());
public class Trend
{
    public string Name { get; set; }
    public string Query { get; set; }
    public string Amount { get; set; }
    public string Delta { get; set; }
}

八、综合实例

void Main()
{
    string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }";
    // 获取员工名称
    JObject jObject = JObject.Parse(json);
    var name = jObject.Value<string>("Name");
    
    Console.WriteLine(name);
    // 获取员工年龄
    JToken jToken = jObject.SelectToken("Age");
    Console.WriteLine(jToken.ToString());
    
    // 获取同事信息
    JToken jToken1 = jObject["Colleagues"];
    Console.WriteLine(jToken1.ToString());
    
    Console.WriteLine("=============================");
    // 获取员工同事的所有姓名
    var names = from staff in jToken1.Children()
                select (string)staff["Name"];
    // var names = jObject.SelectToken("Colleagues").Select(p => p["Name"]).ToList();
    foreach (var item in names)
    {
        Console.WriteLine(item);
    }
    
    Console.WriteLine("=============================");
    // 修改Jack的年龄
    jObject["Age"] = 99;
    Console.WriteLine(jObject.ToString());
    // 修改同事Tome的年龄
    jToken1[0]["Age"] = 45;
    Console.WriteLine(jObject.ToString());
    
    Console.WriteLine("=============================");
    // Abel离职了
    jObject["Colleagues"][1].Remove();
    Console.WriteLine(jObject.ToString());
    // 移除Jack的同事
    jObject.Remove("Colleagues");
    Console.WriteLine(jObject.ToString());
    
    Console.WriteLine("=============================");
    // Jack缺少部门信息
    jObject["Age"].Parent.AddAfterSelf(new JProperty("Department", "总裁办"));
    // 来了一个新员工Jerry
    JObject linda = new JObject(new JProperty("Name", "Linda"), new JProperty("Age", "23"));
    jObject.Add(new JProperty("Colleagues", new JArray() { linda }));
    Console.WriteLine(jObject.ToString());
}

// Define other methods and classes here

到此这篇关于C#使用LINQ to JSON的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#中的Linq to JSON操作详解

本文链接: https://www.lsjlt.com/news/150388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的Linq to JSON操作详解
    目录一、创建JObject and JArrary实例1、手动创建JSON1、创建JSON对象,JObject2、创建JSON数组,JArrary2、使用Linq创建JSON3、从对...
    99+
    2022-11-13
  • C#中的Linq to JSON操作实例分析
    今天小编给大家分享一下C#中的Linq to JSON操作实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-30
  • C#中的LINQ to Objects详解(1)
    目录一、概述二、 Linq to Objects中的延迟计算1. Linq延迟计算的注意点2. 整理Linq to Objects中运算符延迟计算特性1、具有延迟计算的运算符2、立即...
    99+
    2022-11-13
  • C#中的LINQ to Objects详解(2)
    目录四、Linq和反射五、LINQ 和字符串1、LINQ 和文件目录实例1、如何查询具有指定属性或名称的文件实例2、如何按照扩展名对文件进行分组实例3、如何查询一组文件夹中的总字节数...
    99+
    2022-11-13
  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换
    一、DataTable的扩展方法: 1、DataTable转Linq:AsEnumerable 方法 返回的EnumerableRowCollection<DataRow>...
    99+
    2022-11-13
  • C#中的Linq To XML讲解
    一、概述 Overview - LINQ to XML | Microsoft 官方文档 LINQ to XMLLINQ to XML 是一种启用了 LINQ 的内存 XML 编程接...
    99+
    2022-11-13
  • 详细解读Python中的json操作
    目录1.什么是Json2.python数据类型与json数据类型的映射关系3. json中常用的方法3-1   json.dumps()3-2 json.load...
    99+
    2022-11-11
  • C++操作json文件以及jsoncpp配置详解
    前言 json文件是比较轻量级的文件,格式简单,使用方便。用来存放信息相比其他方式有自己得天独厚的优势。 今天给大家分享的是如何利用C++来操作json文件。 如果你知道如何使用js...
    99+
    2022-11-12
  • C#中Linq的去重方式Distinct详解
    前天在做批量数据导入新增时,要对数据进行有效性判断,其中还要去除重复,如果没出现linq的话可能会新声明一个临时对象集合,然后遍历原始数据判断把符合条件的数据添加到临时集合中,这在有...
    99+
    2022-11-13
  • 详细解读python操作json文件的详细
    目录json支持的格式:代码操作1.json转化为python2. python序列化为json总结 json转化为python表示反序列化 python转化为json表示为序列...
    99+
    2022-11-12
  • Python读写JSON文件的操作详解
    目录JSONJSON 起源JSON 样例Python 原生支持 JSON序列化 JSON简单的序列化示例JSON 反序列化简单的反序列化示例应用案例编码和解码JSON JSON 起源...
    99+
    2022-11-10
  • python对json的相关操作实例详解
    本文实例分析了python对json的相关操作。分享给大家供大家参考,具体如下: 什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和...
    99+
    2022-06-04
    详解 实例 操作
  • C语言中的文件操作详解
    目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1fsee...
    99+
    2022-11-13
  • 详解C#winformListView的基本操作
    组图的加载与导入 图片存放的相对路径/ 与exe存放在一个文件夹 为界面添加图片组–组件 图片下载路径链接:img_jb51.rar // 组图的加载与导入 Di...
    99+
    2022-11-13
  • C++中文件操作基础详解
    目录文件操作文件分类文本文件写文件读文件二进制文件写文件读文件文件操作 意义:利用文件操作可以保存我们程序运行的信息,是持久化技术的体现 文件分类 按文件类型分为: 1、文本文件 &...
    99+
    2022-11-13
  • C++中的操作符重载详细解析
    一、什么是操作符重载操作符重载可以分为两部分:“操作符”和“重载”。说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载。运算符重载和函数重载的不同之...
    99+
    2022-11-15
    操作符重载 C++
  • Python嵌入C/C++ 中的元组操作的详细讲解
    本篇内容介绍了“Python嵌入C/C++ 中的元组操作的详细讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 嵌入C/C++...
    99+
    2023-06-17
  • C语言的堆串操作详解
    目录一、堆串概念。二、基本操作。三、运行:总结一、堆串概念。 与定长顺序穿的存储结构类似,都是用一组地址连续的存储单元存储串的字符序列,不同的是堆串的存储空间是动态分配的,只要存储空...
    99+
    2022-11-13
  • C++中的强制类型转换操作详解
    目录相关术语C语言中的强制类型转换C++中的强制类型转换static_castdynamic_castreinterpret_castconst_cast注意事项相关术语 强制类型转...
    99+
    2023-05-17
    C++强制类型转换 C++类型转换
  • 详解C#操作XML的方法总结
    本文的主要模块为: 1.生成xml文件 2.遍历xml文件的节点信息 3.修改xml文件的节点信息 4.向xml文件添加节点信息 5.删除指定xml文件的节点信息 假设我们需要设计出...
    99+
    2022-11-13
    C#操作XML方法 C#操作XML C# XML
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作