欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET中JSON的序列化和反序列化的几种方式

程序员文章站 2022-06-23 21:57:30
一、什么是json json(javascript object notation, js 对象简谱) 是一种轻量级的数据交换格式。它基于 ecmascript (欧...

一、什么是json

json(javascript object notation, js 对象简谱) 是一种轻量级的数据交换格式。它基于 ecmascript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立 于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升 网络传输效率。

是javascript用来处理数据的一种格式,大部分是用来处理javascript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用javascript进 行处理,例如ajax等,是独立于语言和平台的轻量级的数据交换格式。

二、json语法

1、json语法规则

js 语言中,一切都是对象。因此,任何支持的类型都可以通过 json 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

  1. 对象表示为键值对
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

对象:对象在js中是使用花括号包裹{}起来的内容,数据结构为{key1:value1, key2:value2, ...}的键值对结构。在面向对象的语言中,key为对象的属性, value为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。

{"firstname": "brett", "lastname": "mclaughlin"}

数组:数组在js中是方括号[]包裹起来的内容,数据结构为[".net", "javascript", "python", ...]的索引结构。在js中,数组是一种比较特殊的数据类型,它也可 以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

{
  "people": [{
      "firstname": "zhang",
      "lastname": "san"
    },
    {
      "firstname": "li",
      "lastname": "si"
    }
  ]
}

2、json 键/值对

json键值对是用来保存js对象的一种方式,和js对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值:  { " firstname " : " json " } , 这很容易理解,等价于这条 javascript 语句:  {firstname : " json " } 

3、json 与 js 对象的关系

js对象的关系,可以这么理解:json 是 js 对象的字符串表示法,它使用文本表示一个 js 对象的信息,本质是一个字符串。如:

var obj = {a: 'hello', b: 'world'};    //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "hello", "b": "world"}'; //这是一个 json 字符串,本质是一个字符串

4、json 和 js 对象互转

要实现从对象转换为 json 字符串,使用 json.stringify() 方法:

var json = json.stringify({a: 'hello', b: 'world'}); //结果是 '{"a": "hello", "b": "world"}'

要实现从 json 转换为对象,使用 json.parse() 方法:

var obj = json.parse('{"a": "hello", "b": "world"}'); //结果是 {a: 'hello', b: 'world'}

三、json序列化方式

1、javascriptserializer

使用javascriptserializer方式需要引入的命名空间,这个在程序集system.web.extensions.dll.中。

using system.web.script.serialization;

ps: 可用[scriptignore] 标记不序列化的属性

code:

public actionresult getjsondemo()
{
  //对象
  datamodel model = new datamodel();
  model.id = 1;
  model.name = "zhangsan";
  model.sex = "女";
  model.age = 18;

  //对象序列化json
  string strjson= jsonhelper.objecttojson(model);

  //json反序列化对象
  model= jsonhelper.jsontoobject<datamodel>(strjson);

  string strcontent = "对象序列化:" + strjson + "\n"+
            "反序列化值:" + model.name + " " + model.sex + " " + model.age;
  return content(strcontent);
}

jsonhelper:

public class jsonhelper
{
  #region 第一种 javascriptserializer 
  //使用javascriptserializer方式需要引入的命名空间,这个在程序集system.web.extensions.dll.中 
  //using system.web.script.serialization;
  //注:可用[scriptignore] 标记不序列化的属性
  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string objecttojson(object obj)
  {
    javascriptserializer jsonserialize = new javascriptserializer();
    return jsonserialize.serialize(obj);
  }

  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="t"></typeparam>
  /// <param name="strjson"></param>
  /// <returns></returns>
  public static t jsontoobject<t>(string strjson)
  {
    javascriptserializer jsonserialize = new javascriptserializer();
    //jsonserialize.deserialize<dynamic>(strjson); //取值model["name"]; 要使用索引取值,不能使用对象.属性
    return jsonserialize.deserialize<t>(strjson);
  }
  #endregion
}

result:

 .NET中JSON的序列化和反序列化的几种方式

2、json.net

使用json.net类库需要引入的命名空间 using newtonsoft.json;

ps: 可用[jsonignore]标记不序列化的属性

code:

public actionresult getjsondemo()
{
  //对象
  datamodel model = new datamodel();
  model.id = 2;
  model.name = "lisi";
  model.sex = "男";
  model.age = 20;

  //对象序列化json
  string strjson = jsonhelper.objecttojson(model);

  //json反序列化对象
  model = jsonhelper.jsontoobject<datamodel>(strjson);

  string strcontent = "对象序列化:" + strjson + "\n" +
            "反序列化值:" + model.name + " " + model.sex + " " + model.age;
  return content(strcontent);
}

jsonhelper:

/// <summary>
/// json 帮助类
/// </summary>
public class jsonhelper
{
  #region 第二种 json.net 
  //使用json.net类库需要引入的命名空间 using newtonsoft.json;
  //注:可用[jsonignore]标记不序列化的属性

  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string objecttojson(object obj)
  {
    return jsonconvert.serializeobject(obj);
  }

  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="t"></typeparam>
  /// <param name="strjson"></param>
  /// <returns></returns>
  public static t jsontoobject<t>(string strjson)
  {
    return jsonconvert.deserializeobject<t>(strjson);
  }
  #endregion
}

result:

 .NET中JSON的序列化和反序列化的几种方式

3、datacontractjsonserializer

使用datacontractjsonserializer方式需要引入的命名空间,在system.runtime.serialization.dll.中。

using system.runtime.serialization.json;

实体中的契约[datamember],[datacontract],是使用datacontractjsonserializer序列化和反序列化必须要加的,对于其他两种方式可加可不加。

ps: 可用[ignoredatamember] 标记不序列化的属性

code:

public actionresult getjsondemo()
{
  //对象
  datamodel model = new datamodel();
  model.id = 3;
  model.name = "wangwu";
  model.sex = "女";
  model.age = 22;

  //对象序列化json
  string strjson = jsonhelper.objecttojson(model);

  //json反序列化对象
  model = jsonhelper.jsontoobject<datamodel>(strjson);

  string strcontent = "对象序列化:" + strjson + "\n" +
            "反序列化值:" + model.name + " " + model.sex + " " + model.age;
  return content(strcontent);
}

jsonhelper:

/// <summary>
/// json 帮助类
/// </summary>
public class jsonhelper
{
 #region 第三种 datacontractjsonserializer
 //使用datacontractjsonserializer方式需要引入的命名空间,在system.runtime.serialization.dll.中
 //using system.runtime.serialization.json;
 //注:可用[ignoredatamember] 标记不序列化的属性
 //实体中的契约[datamember],[datacontract],是使用datacontractjsonserializer序列化和反序列化必须要加的
 //对于其他两种方式不必加,也可以的。
 
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public static string objecttojson(object obj)
 {
   using (memorystream stream = new memorystream())
   {
     datacontractjsonserializer jsonserialize = new datacontractjsonserializer(obj.gettype());
     jsonserialize.writeobject(stream, obj);
     return encoding.utf8.getstring(stream.toarray());
   }
 }
 
 /// <summary>
 /// 反序列化
 /// </summary>
 /// <typeparam name="t"></typeparam>
 /// <param name="strjson"></param>
 /// <returns></returns>
 public static t jsontoobject<t>(string strjson)
 {
   using (memorystream stream = new memorystream(encoding.utf8.getbytes(strjson)))
   {
     datacontractjsonserializer jsonserialize = new datacontractjsonserializer(typeof(t));
     return (t)jsonserialize.readobject(stream);
   }
 }
 
 #endregion
}

result:

 .NET中JSON的序列化和反序列化的几种方式

ps: datamodel

[datacontract]
public class datamodel
{
  [datamember]
  public int id { get; set; }

  [datamember]
  public string name { get; set; }

  [datamember]
  public string sex { get; set; }

  [datamember]
  public int age { get; set; }
}

四、总结

1、json序列化有三种方式

  1. javascriptserializer类
  2. json.net类库
  3. datacontractjsonserializer类

2、尽量使用json.net(开源)来序列化和反序列化,性能好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。