.Net 中对象序列化中特殊字符的处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

最近在开发过程中碰到了一个问题:需要将对象序列化为json字符串,并且需要将json字符串中的双引号替换成单引号,但在这个过程中有的对象中的属性值包含了单引号 例如 :Tom’ s,这就导致了在反序列化时报错,开始想的试把序列化之前单引号替换成 ’ 进行转义,会发现并不能成功转义,而且需要将对象中的所有属性都类似的处理,很麻烦。于是在经过查找研究后终于找到了合适解决方案。


提示:使用的是 第三方包 Newtonsoft.Json (Json.NET)做的对象序列化,可以在NuGet 上下载最新版本

一、对象序列化中双引号改成单引号

在 Newtonsoft.Json 11.0.1 版本 之前可以使用 QuoteChar=“'” 来指定为单引号,但在11.0.1版本之后移除了这个功能。

1、旧版本推荐写法

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.IO;

public class SingleQuoteJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override bool CanRead => true;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            return reader.Value.ToString().Replace("\"", "'");
        }
        else
        {
            return reader.Value;
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.QuoteChar = '\'';
        writer.WriteValue(value.ToString().Replace("'", "\""));
    }
}

2、最新版本推荐写法

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person { Name = "Alice", Age = 25 };

        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Formatting.None
        };

        string json = JsonConvert.SerializeObject(person, settings)
                           .Replace("\"", "'");

        Console.WriteLine(json);   // {'name':'Alice','age':25}
    }
}

二、序列化中特殊字符的处理

using Newtonsoft.Json;

public class Person 
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }
}

//序列化
Person person = new Person { Name = "Tom's" };
JsonSerializerSettings settings = new JsonSerializerSettings 
{
    StringEscapeHandling = StringEscapeHandling.EscapeHtml
};
string json = JsonConvert.SerializeObject(person, settings);
Console.WriteLine(json); // {"name":"Tom\u0027s"}

//反序列化
string jsonString = "{'name':'Tom\\u0027s'}";
Person person = JsonConvert.DeserializeObject<Person>(jsonString);
Console.WriteLine(person.Name); // Tom's

StringEscapeHandling 是 JsonSerializerSettings 中的一个属性,用于设置 JSON 字符串的转义处理方式。它的值是一个枚举类型 Newtonsoft.Json.StringEscapeHandling,包含了三个成员:

  • Default: 默认设置。将特殊字符替换为 Unicode 转义序列的方式进行转义。
  • EscapeNonAscii: 仅对非 ASCII 字符进行转义,将 ASCII 字符放在 JSON 字符串中不加转义地输出。
  • EscapeHtml: 将字符串中的特殊字符(比如 >, <, &, ', ")转换为 HTML 编码的方式进行转义,以便在 HTML 页面中安全地显示。

更多用法请参考官方文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值