类别:程序开发

日期:2024-03-26 浏览:632 评论:0

前言

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

最近在开发过程中碰到了一个问题:需要将对象序列化为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 页面中安全地显示。

————————————————


本文标题:.Net 中对象序列化中特殊字符的处理
本文链接:https://vtzw.com/post/1118.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一的世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
 您阅读本篇文章共花了: 

 可能感兴趣的文章

评论区

发表评论 / 取消回复

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。