C#解析json文件的方法

C# 解析 json


  JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。 JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。

JSON与XML的比较
◆可读性
  JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解。
◆文件大小与传输
  XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于Javascript,所以天生的主战场是Javascript与网络,在这里,JSON有着XML无法赶超的优势。

JSON语法
1. JSON 语法是 JavaScript 对象表示法语法的子集。

  • 数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
  • 数据由逗号分隔:
  • 花括号保存对象:对象可以包含各种数据,包括数组。
  • 方括号保存数组:数字可以包含对象。

例如:

复制代码
{
    "employees": [
        {
            "firstName": "Bill",
            "lastName": "Gates"
        },
        {
            "firstName": "George",
            "lastName": "Bush"
        }
    ]
}
复制代码

2. 如果JSON中含有转义字符,则需要转义。例如文件路径中需要使用"\\"而不是"\"。例如:{ "file":"C:\\a.txt"}。

 

.NET操作JSON
  JSON文件读入到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。操作JSON通常有以下几种方式:
1. 原始方式:自己按照JSON的语法格式,写代码直接操作JSON字符串。如非必要,应该很少人会走这条路,从头再来的。

2. 通用方式【★★★★★】

这种方式是使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后加入工程就能用。通常可以使用JObject, JsonReader, JsonWriter处理。这种方式最通用,也最灵活,可以随时修改不爽的地方。
(1)使用JsonReader读Json字符串:

复制代码
string jsonText = @"{""input"" : ""value"", ""output"" : ""result""}";
JsonReader reader = new JsonTextReader(new StringReader(jsonText));

while (reader.Read())
{
    Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);
}
复制代码

(2)使用JsonWriter写字符串:

复制代码
StringWriter sw = new StringWriter();
JsonWriter writer = new JsonTextWriter(sw);

writer.WriteStartObject();
writer.WritePropertyName("input");
writer.WriteValue("value");
writer.WritePropertyName("output");
writer.WriteValue("result");
writer.WriteEndObject();
writer.Flush();

string jsonText = sw.GetStringBuilder().ToString();
Console.WriteLine(jsonText);
复制代码

 (3)使用JObject读写字符串:

JObject jo = JObject.Parse(jsonText);
string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();

 (4)使用JsonSerializer读写对象(基于JsonWriter与JsonReader): 

数组型数据

复制代码
string jsonArrayText1 = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]";
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);
string ja1a = ja[1]["a"].ToString();
//或者
JObject o = (JObject)ja[1];
string oa = o["a"].ToString();
复制代码

嵌套格式

string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["beijing"]["zone"].ToString();
string zone_en = jo["beijing"]["zone_en"].ToString();

自定义类Project

复制代码
Project p = new Project() { Input = "stone", Output = "gold" };
JsonSerializer serializer = new JsonSerializer();
StringWriter sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), p);
Console.WriteLine(sw.GetStringBuilder().ToString());

StringReader sr = new StringReader(@"{""Input"":""stone"", ""Output"":""gold""}");
Project p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Project));
Console.WriteLine(p1.Input + "=>" + p1.Output);
复制代码

  上面的代码都是基于下面这个Project类定义:

class Project
{
    public string Input { get; set; }
    public string Output { get; set; }
}

  此外,如果上面的JsonTextReader等类编译不过的话,说明是我们自己修改过的类,换成你们自己的相关类就可以了,不影响使用。

3. 内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。

复制代码
Project p = new Project() { Input = "stone", Output = "gold" };
 JavaScriptSerializer serializer = new JavaScriptSerializer();
 var json = serializer.Serialize(p);
 Console.WriteLine(json);

 var p1 = serializer.Deserialize<Project>(json);
 Console.WriteLine(p1.Input + "=>" + p1.Output);
 Console.WriteLine(ReferenceEquals(p,p1));
复制代码

  注意:如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
  此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式

4. 契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现。

复制代码
Project p = new Project() { Input = "stone", Output = "gold" };
DataContractJsonSerializer serializer = new DataContractJsonSerializer(p.GetType());
string jsonText;

using (MemoryStream stream = new MemoryStream())
{
    serializer.WriteObject(stream, p);
    jsonText = Encoding.UTF8.GetString(stream.ToArray());
    Console.WriteLine(jsonText);
}

using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
{
    DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Project));
    Project p1 = (Project)serializer1.ReadObject(ms);
    Console.WriteLine(p1.Input + "=>" + p1.Output);
}
复制代码

  这里要注意,这里的Project类和成员要加相关的Attribute:

复制代码
[DataContract]
class Project
{
    [DataMember]
    public string Input { get; set; }
    [DataMember]
    public string Output { get; set; }
}
复制代码


实用参考:
JSON验证工具:http://jsonlint.com/
JSON简明教程:http://www.w3school.com.cn/json/
Newtonsoft.Json类库下载:http://json.codeplex.com/

原文: http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-json.html

转载于:https://www.cnblogs.com/Zhaols/p/5986650.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring 线程池_Spring线程池服务

spring 线程池线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 &#xff1a; JDK 1.6.0_21 春天3.0.5 Maven的3.0.2 步骤1&#xff1a;建立已完成的专案 创建一个Maven项目&…

arrayQueue

用数组实现队列&#xff1a; 定义头文件&#xff1a; 1 #include<stdio.h>2 #include<stdlib.h>3 #define MAX_SIZE 104 int queue[MAX_SIZE];5 int front-1;6 int rear-1;7 8 int IsFull(int queue[]); //判断队列是否已满 9 int IsEmpty(int queue[]); …

109. Convert Sorted List to Binary Search Tree

不定期更新leetcode解题java答案。 采用pick one的方式选择题目。 题意为将一个增序单链表转换成为二叉搜索树。 可以采用递归的方式依次确认该层应选择的单链表位置作为树的节点依次向下进行。每次选择做树该层的节点为链表的中间值。 代码如下&#xff1a; 1 /**2 * Definit…

带有骆驼,ActiveMQ,Elasticsearch的HL7关键用例

对于可以说HL7协议格式的系统&#xff0c; HL7 over MLLP是一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台&#xff0c;在为关键医疗保健提供者构建灵活&#xff0c;有弹性&#xff0c;高可用性的集成方案方面拥有良好的记录。 此外&#xff0c;在JCA…

android 包裹内容,Android开发中Bundle用法 包裹数据

SDK里是这样描述&#xff1a;A mapping from String values to various Parcelable types。它帮助我将数据打包传入intent里面&#xff0c;为使用这些数据提供了便利。protected void onListItemClick (ListView l, View v, int position, long id){super.onListItemClick(l, v…

安卓高级6 SnackBar

引言 文&#xff0f;李牧羊&#xff08;简书作者&#xff09; 原文链接&#xff1a;http://www.jianshu.com/p/2654e6bda3b1 著作权归作者所有&#xff0c;转载请联系作者获得授权&#xff0c;并标注“简书作者”。 在之前我有提到这一篇Android Design Support Library系列文章…

html语言及语法结构,HTML语法结构.ppt

HTML语法结构HTML超文本标识语言 HTML超文本标识语言 HTML概念 HTML(Hyper Text Markup Language 超文本标识语言) 是一种用来制作超文本文档的简单标记语言。用HTML编写的超文本文档称为HTML文档。 HTML超文本标识语言 HTML文档的编写方法 1.手 工 直 接 编 写 记事本等&#…

利用Aspose.Word控件实现Word文档的操作

Aspose系列的控件&#xff0c;功能都挺好&#xff0c;之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出&#xff0c;可以实现多样化的报表设计及输出&#xff0c;由于一般输出的内容比较正规化或者多数是表格居多&#xff0c;所以一般使用Aspose.Cell来实现我想要的各…

html编码自动识别,html实体编码遇上js代码

摘要&#xff1a; 在js中单、双引号引起来的是字符串&#xff0c;如果我们要在字符串中使用单、双引号&#xff0c;需要反斜杠进行转义。而如果字符串出现在html标签中&#xff0c;我们需要做转义处理。单双引号在js代码中在js中单、双引号引起来的是字符串&#xff0c;如果我们…

jpa动态扩展sql_扩展您的JPA POJO

jpa动态扩展sql可扩展性是许多体系结构的重要特征。 它衡量是否容易&#xff08;或困难&#xff09; 它是在不影响现有核心系统功能的情况下添加或更改功能。 让我们举一个简单的例子。 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户。 在您的产品体系结构中&…

手机 html 折叠效果,HTML5仿苹果手机的面板合拢折叠效果

passbook仿苹果手机的面板合拢折叠效果-html5特效.pocket{width:300px;height:460px;padding: 10px;overflow: hidden;float: left;border: 1px solid #EDEDED;margin: 4px;border-radius: 8px;box-shadow:0 -5px 30px rgba(0,0,0,0.2) inset;}.passcard {float: left;width:30…

Activiti中具有单独数据库模式的多租户

我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他租户的数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;与我接触&…

dfs手写栈模板

在竞赛中如果系统栈很小的话&#xff0c;过深的递归会让栈溢出&#xff0c;这个时候我们就要自己手写栈&#xff0c;将递归转化成手工栈。 方法其实也很简单。 基本思路上&#xff0c;我们就是用栈不断的pop,push。但是何时push&#xff0c;何时pop呢&#xff1f; 在《算法导论…

html5自动把某个层放在屏幕底部,告诉你一个将 footer 保持在底部的最好方法

当你在布局网页时&#xff0c;有可能会遇到类似下面的这种情况broken_layout.png导致这一问题的原因是页面内容太少&#xff0c;无法将内容区域撑开&#xff0c;从而在 footer 下面留下一大块空白。本文将介绍一种现代化的方法&#xff0c;&#xfffd;确保 footer 始终处于页面…

前后数据交互(ajax) -- 初始化页面表格

// 初始化员工信息列表 function loadpage ( pageNum ) {var keywords $("#keywords").val();$("#tbody").html("");if ( isNaN(pageNum) ) {pageNum 1;}$.$.ajax({type: GET,url: contextPath "/getaccountList/" pageNum "…

html的扇形代码导航,CSS3--利用transform和transition属性制作扇形导航

在前面&#xff0c;我们已经讲解了transform这个属性以及案例&#xff0c;那么本文会进一步结合transform和transition两个属性&#xff0c;并制作一个简单的案例进行说明。一、transition属性说明接下来简单分析一下transition这个属性的定义以及子属性。1)ansition-property …

UCI数据

http://archive.ics.uci.edu/ml/datasets.html?format&task&att&area&numAtt&numIns&type&sortinstDown&viewtable转载于:https://www.cnblogs.com/zangrunqiang/p/5999238.html

常见的误解:这会创建多少个对象?

总览 一个常见的问题是一段代码创建多少个对象或多少个字符串。 答案通常不是您的想法&#xff0c;也不是您真正需要知道的。 了解何时创建对象是很有用的&#xff0c;但是有很多其他因素通常要考虑的重要得多&#xff0c;这可能意味着应用程序总数不是您所想的。 字符串不是一…

cvs配电保护断路器_电工电器(三)-配电电器-断路器类-剩余电流保护断路器

本文文字836&#xff0c;阅读时间6分钟左右。此系列文章 从配电电器的大类等进行慢慢阐述&#xff0c;有不足的地方 欢迎大家相互探讨交流。配电电器&#xff0c;顾名思义就是进行电力分配的设备。电&#xff0c;从发电机出来之后&#xff0c;由总线输出&#xff0c;不可能直接…

html模块殃射,【Web前端问题】webpack打包后,module模块中的函数无法在html标签的事件中调用?...

折腾了好久&#xff0c;求大佬指点~~最近才开始接触webpack以及ES6的module&#xff0c;可能理解的有问题吧。。。希望大佬来指点一下我这个菜鸟。我的想法是在一个module中定义函数&#xff0c;在HTML的中用onclick事件调用这个函数。module模块代码&#xff1a;— base.js —…