提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
最近在开发过程中碰到了一个问题:需要将对象序列化为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 页面中安全地显示。