c#操作json示例分享

 更新时间:2020年6月25日 11:36  点击:1687

1..NET对JSON的支持介绍

(1)操作Json的DLL介绍

.NET自身有System.Runtime.Serialization.dll与System.Web.Extensions.dll,使用这两个DLL可以把对象序列化和反序列化成Json数据。也可以使用第三方的Newtonsoft.Json.dll来操作Json数据,使用它会更方便的操作Json数据,其功能也跟强一些。

(2)使用System.Web.Extensions.dll的限制

要使用System.Web.Extensions.dll必须是在Web项目中,只有在Web项目中才能引用此DLL。

2.JSON序列化和反序列化

(1)使用Newtonsoft.Json.dll实现

代码示例:

复制代码 代码如下:

public class Person
{
public string Name;//姓名
public bool Sex;//性别,是否是男
public Person(string name, bool sex)
{
this.Name = name;
this.Sex = sex;
}
public override string ToString()
{
return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
}
}
public class Programmer : Person
{
public List<string> Languages;//编程语言
public Programmer(string name, bool sex, List<string> languages) : base(name, sex)
{
this.Languages = languages;
}
public override string ToString()
{
StringBuilder str = new StringBuilder();
str.Append(base.ToString() + "\t编程语言:");
foreach (string l in this.Languages)
{
str.Append(l + " ");
}
return str.ToString();
}
}
class Program
{
static void Main(string[] args)
{
string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";
List<string> languages = null;
List<Programmer> list = new List<Programmer>();
languages = new List<string>(new string[] { "C#", "Java" });
list.Add(new Programmer("李志伟", true, languages));
languages = new List<string>(new string[] { "C#", "C++" });
list.Add(new Programmer("Coder2", false, languages));
languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });
list.Add(new Programmer("Coder3", true, languages));
//序列化对象
string jsonStr = JsonConvert.SerializeObject(list);//将对象转换成json存储
File.WriteAllText(filePath, jsonStr);
list.Clear();
//反序列化对象
list = JsonConvert.DeserializeObject<List<Programmer>>(jsonStr);
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
Console.WriteLine("OK!");
Console.Read();
}
}

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志伟","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此种方式Json序列化对象时,只能序列化对象的公有成员。

(2)使用System.Web.Extensions.dll实现

代码示例:

复制代码 代码如下:

public class Person

{

public string Name;//姓名

public bool Sex;//性别,是否是男

public Person() { }//必须有此构造方法,否者无法反序列化

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

}

}

public class Programmer : Person

{

public List<string> Languages;//编程语言

public Programmer() { }//必须有此构造方法,否者无法反序列化

public Programmer(string name, bool sex, List<string> languages)

: base(name, sex)

{

this.Languages = languages;

}

public override string ToString()

{

StringBuilder str = new StringBuilder();

str.Append(base.ToString() + "\t编程语言:");

foreach (string l in this.Languages)

{

str.Append(l + " ");

}

return str.ToString();

}

}

public partial class WebForm1 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)//Web页面的加载事件

{

List<string> languages = null;

List<Programmer> list = new List<Programmer>();

languages = new List<string>(new string[] { "C#", "Java" });

list.Add(new Programmer("李志伟", true, languages));

languages = new List<string>(new string[] { "C#", "C++" });

list.Add(new Programmer("Coder2", false, languages));

languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

list.Add(new Programmer("Coder3", true, languages));

//序列化对象

JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();

string jsonStr = jsonSerialize.Serialize(list);//将对象转换成json存储

Response.Write(jsonStr + "<br>");//前台输出

//反序列化对象

list.Clear();

list = jsonSerialize.Deserialize<List<Programmer>>(jsonStr);

foreach (Programmer p in list)

{

Response.Write(p + "<br>");//前台输出

}

}

}

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志伟","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此种方式Json序列化对象时,除了只能序列化对象的公有成员外,被序列化的对象还必须有无参的构造方法才能被反序列化!System.Web.Extensions.dll只能在Web项目中引用,在控制台和WinFrom项目中无法引用!

(3)使用System.Runtime.Serialization.dll实现

代码示例:

复制代码 代码如下:

[DataContract]//必须申明,否则无法序列化

public class Person

{

[DataMember(Name = "姓名")]//必须申明,否则无法序列化

private string Name;

[DataMember(Name = "性别")]//必须申明,否则无法序列化

private bool Sex;

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

}

}

[DataContract]

public class Programmer : Person

{

[DataMember(Name = "编程语言")]

private List<string> Languages;

public Programmer(string name, bool sex, List<string> languages)

: base(name, sex)

{

this.Languages = languages;

}

public override string ToString()

{

StringBuilder str = new StringBuilder();

str.Append(base.ToString() + "\t编程语言:");

foreach (string l in this.Languages)

{

str.Append(l + " ");

}

return str.ToString();

}

}

class Program

{

static void Main(string[] args)

{

string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";

List<string> languages = null;

List<Programmer> list = new List<Programmer>();

languages = new List<string>(new string[] { "C#", "Java" });

list.Add(new Programmer("李志伟", true, languages));

languages = new List<string>(new string[] { "C#", "C++" });

list.Add(new Programmer("Coder2", false, languages));

languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

list.Add(new Programmer("Coder3", true, languages));

//序列化对象

DataContractJsonSerializer ser =

new DataContractJsonSerializer(typeof(List<Programmer>));

MemoryStream ms = new MemoryStream();

ser.WriteObject(ms, list);//将对象转换成json存储

string jsonStr = Encoding.UTF8.GetString(ms.ToArray());

File.WriteAllText(filePath, jsonStr);

//反序列化对象

list.Clear();

ms.Position = 0;

list = (List<Programmer>)ser.ReadObject(ms);

foreach (Programmer p in list)

{

Console.WriteLine(p);

}

ms.Dispose();//关闭内存流

Console.WriteLine("OK!");

Console.Read();

}

}
[code]

得到的Json文本:

[{"姓名":"李志伟","性别":true,"编程语言":["C#","Java"]},

{"姓名":"Coder2","性别":false,"编程语言":["C#","C++"]},

{"姓名":"Coder3","性别":true,"编程语言":["C#","C++","C","Java"]}]

注意:此种方式Json序列化对象时,可以序列化对象的任意成员(包括私有成员),但是使用此方式必须要在类和成员的定义处加上相应的特性(具体请参考代码)。

(4)小结

3.解析JSON字符串(使用Newtonsoft.Json.dll)

(1)使用JsonTextReader类进行只进读取(不常用)
[code]
class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"

[{'Languages':['C#','Java'],'Name':'李志伟','Sex':true},

{'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

{'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

JsonTextReader json = new JsonTextReader(new StringReader(jsonStr));

while (json.Read())

{

Console.WriteLine(json.Value + "--" + json.TokenType + "--" + json.ValueType);

}

Console.WriteLine("OK!");

Console.Read();

}

}

(2)使用JArray、JObject、JToken进行读取(常用)

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"

[{'Languages':['C#','Java'],'Name':'李志伟','Sex':true},

{'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

{'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

JArray ja = (JArray)JsonConvert.DeserializeObject(jsonStr);

foreach (JToken jt in ja)

{

JObject jo = (JObject)jt;

JArray temp = (JArray)jo["Languages"];

foreach (JToken token in temp)

{

Console.Write(token+" ");

}

Console.WriteLine("\t" + jo["Name"] + "\t" + jo["Sex"]);

}

Console.WriteLine("OK!");

Console.Read();

}

}

(3)Json时间字符串的处理

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

DateTime time = DateTime.Now;

//这里使用自定义日期格式

IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();

timeConverter.DateTimeFormat = "北京时间:yyyy-MM-dd HH:mm:ss";

//序列化时间

string JsonStr = JsonConvert.SerializeObject(time, timeConverter);

Console.WriteLine(JsonStr);

//反序列化时间

DateTime time2 = JsonConvert.DeserializeObject<DateTime>(JsonStr, timeConverter);

Console.WriteLine(time2);

Console.WriteLine("OK!");

Console.Read();

}

}

4.读取Json字符串的技巧

(1)使用匿名类

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志伟','Sex':true}";

//创建匿名类

var TempClass = new { Languages = new string[0], Name = string.Empty, Sex = false };

//反序列化

var O = JsonConvert.DeserializeAnonymousType(jsonStr, TempClass);

Console.WriteLine(O.Name+"\t"+O.Sex+"\t"+O.Languages[1]);

Console.Read();

}

}

(2)使用索引器

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志伟','Sex':true}";

//反序列化

JObject O = JsonConvert.DeserializeObject(jsonStr) as JObject;

//使用索引器访问

Console.WriteLine(O["Name"] + "\t" + O["Sex"] + "\t" + O["Languages"][1]);

Console.Read();

}
}

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15