当前位置: 移动技术网 > IT编程>开发语言>.net > .NET中JSON的序列化和反序列化的几种方式

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

2018年08月05日  | 移动技术网IT编程  | 我要评论

微光月亮石,毛小平的情人,有没有网站你懂的

一、什么是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:

 

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:

 

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:

 

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(开源)来序列化和反序列化,性能好。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网