类别:程序开发
日期:2024-03-26 浏览:1315 评论: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 页面中安全地显示。
————————————————
发表评论 / 取消回复