§ ITPOW >> 文档 >> C#

C# 中处理 JSON-使用 DataContractJsonSerializer

作者:vkvi 来源:ITPOW(原创) 日期:2016-10-23

添加引用

如果是 .NET 3.5 则需要添加两个引用(注意是引用,不是命名空间):

  • System.ServiceModel.Web

  • System.Runtime.Serialization

如果是 .NET 4.0 则只需要添加一个引用:

  • System.Runtime.Serialization

核心类

using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;

namespace Cftea
{
    public class JsonHelper
    {
        /// <summary>
        /// 将 JSON 对象转换成 JSON 格式的字符串。
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ObjectToString(object jsonObject)
        {
            string result = "";

            using (MemoryStream ms = new MemoryStream())
            {
                // 对象 ==>> MemoryStream
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(jsonObject.GetType());
                serializer.WriteObject(ms, jsonObject);

                // MemoryStream ==>> 字符串
                ms.Position = 0;
                using (StreamReader reader = new StreamReader(ms))
                {
                    result = reader.ReadToEnd();
                    reader.Close();
                }

                ms.Close();
            }

            return result;
        }


        /// <summary>
        /// 将 JSON 格式的字符串转换成 JSON 对象。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        public static T StringToObject<T>(string jsonString)
        {
            T result;

            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                result = (T)serializer.ReadObject(ms);

                ms.Close();
            }

            return result;
        }
    }
}

使用示例

public class Book
{
	public string Name { get; set; }
	public decimal Price { get; set; }
}

// ObjectToString 应用示例
Book book = new Book();
book.Name = "ITPOW丛书";
book.Price = 95m;
string str = JsonHelper.ObjectToString(book);
MessageBox.Show(str);

// StringToObject 应用示例
Book newBook = JsonHelper.StringToObject<Book>("{ \"Name\" : \"ITPOW新书\", \"Price\" : 98 }");
MessageBox.Show(newBook.Name);

注意:Book 一定要是 public 的,否则会出现“无法序列化类型”的错误。

JSON 字符串

JSON 字符串如果为 Null、Empty、非 JSON 格式

异常

JSON 字符串中有多余的属性

忽略字符串中多余的属性。

JSON 字符串中有缺失的属性

类中,这些缺失的属性,其值为构造函数中赋的值,如果构造函数中没有赋值,则使用默认值(数字 0、字符串 null)。

JSON 字符串中属性名称与类属性名称一样,但数据类型不一样

JSON 字符串中属性名称与类属性名称一样时,就可映射,当数据类型不一样时,自动转换,如果转换失败,则异常

其他

说明:属性的“读”和“写”都必须是 public 的。有人说,我的“写”如果不是 public 的,转换成 JSON 字符串有什么影响,似乎不会有影响吧,又不是“读”?答案是:JSON 字符串中照样会跳过这个属性。

生成的 JSON 字符串中的属性是按属性名称的 ASCII 排列的。

注意:.NET 中的 JSON 是标准格式,即属性名称要用双引号引起来。

  • 正确的格式:{ "Name" : "ITPOW新书" }

  • 错误的格式:{ Name : "ITPOW新书" }

相关阅读

相关文章