基于.NET编写工具类解决JSON乱码问题

2025-03-05 17:50

本文主要是介绍基于.NET编写工具类解决JSON乱码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解...

在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题。这种情况通常发生在原始数据以UTF-8编码,却被错误地用GBK等其他编码解码时。为了解决这个问题,我开发了一个名为JsonEncodingFixer的.NET工具类,它可以有效地修复因编码错误导致的JSON乱码问题。

问题背景

在实际开发中,JSON数据的编码和解码是一个常见的环节。然而,当数据在不同系统之间传输时,可能会因为编码不一致而出现乱码。例如:

  • 原始数据以UTF-8编码存储。
  • 在传输或解析过程中,数据被错误地用GBK编码解码。
  • 最终导致JSON字符串中出现乱码。

这种问题不仅影响数据的可读性,还可能导致后续处理失败。因此,我们需要一个工具来修复这种编码错误。

核心原理

JsonEncodingFixer的核心原理是通过以下步骤修复乱码:

逆向工程:将错误解码的字符串重新编码为原始的错误字节。

正确解码:使用正确的编码(如UTF-8)重新解析这些字节。

具体来说,我们先将乱码字符串用GBK编码转换为字节数组,然后用UTF-8编码重新解析这些字节,从而恢复原始的正确字符串。

工具类实现

以下是JsonEncodingFixer工具类的完整代码实现,包含详细的注释和说明:

using System;
using System.IO;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;

namespace HalconCenter
{
    /// <summary>
    /// JSON编码修复工具类
    ///  javascript适用场景:修复因编码错误导致的JSON乱码问题,典型场景是:
    /// 1. 原始数据使用UTF-8编码
    /// 2. 被错误地用GBK等非UTF-8编码解码
    /// 3. 导致JSON字符串出现乱码
    /// </summary>
    public class JsonEncodingFixer
    {
        /// <summary>
        /// 修复单个错误编码的字符串
        ///  核心原理:错误解码 -> 还原原始错误字节 -> 正确编码重新解码
        /// </summary>
        /// <param name="garbledText">乱码字符串(UTF-8字节被误用GBK解码的结果)</param>
        /// <returns>修复后的正确字符串</returns>
        public static string FixEncoding(string garbledText)
        {
            try
            {
                //  注册扩展编码支持(.NET Core默认不包含GBK等编码)
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

                //  逆向工程:将错误解码的字符串重新编码为原始错误字节
                // 等效于:错误解码的逆过程,获取原始传输时的错误字节
                byte[] wrongBytes = Encoding.GetEncoding("GBK").GetBytes(garbledText);

                //  正确解码:用本应有的UTF-8编码重新解析原始字节
                return Encoding.UTF8.GetString(wrongBytes);
            }
            catch (Exception ex)
            {
                //  异常处理原则:保证业务连续性,宁可返回乱码也不阻断流程
                Console.WriteLine($"编码转换失败: {ex.Message}");
                return garbledText;
            }
        }

        /// <summary>
        /// 自动修复整个JSON对象
        ///  实现策略:
        /// 1. 解析原始JSON结构
        /// 2. 深度遍历所有节点
        /// 3. 修复每个字符串节点的编码
        /// 4. 重建JSON结构保持格式
        /// </summary>
        /// <param name="json">需要修复的JSON字符串</param>
        /// <returns>修复编码后的JSON字符串</returns>
        public static string FixJsonEncoding(string json)
        {
            //  使用JsonDocument解析而非反序列化,避免类型转换干扰
            using (JsonDocument doc = JsonDocument.Parse(json))
            using (var ms = new MemoryStream())
            {
                //  关键配置:设置宽松的JSON编码规则(防止二次转义)
                var options = new JsonWriterOptions
                {
                    Indented = true,                          // 保持美观格式
                    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 允许中文等特殊字符
                };

                //  使用Utf8JsonWriter重新构建JSON
                using (var writer = new Utf8JsonWriter(ms, options))
                {
                    WriteFixedValue(doc.RootElement, writer);
                }
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        www.chinasem.cn}

        /// <summary>
        /// 递归写入修复后的JSON值
        ///  遍历策略:
        /// 1. 对象:修复每个属性名和属性值
        /// 2. 数组:修复每个元素
        /// 3. 字符串:应用FixEncoding修复
        /// 4. 其他类型:保持原始值
        /// </summary>
        /// <param name="element">当前JSON元素</param>
        /// <param name="writer">JSON写入器</param>
        private static void WriteFixedValue(JsonElement element, Utf8JsonWriter writer)
        {
            switch (element.ValueKind)
            {
                case JsonValueKind.Object:
                    writer.WriteStartObject();
                    foreach (System.Text.Json.JsonProperty prop in element.EnumerateObject())
                    {
                        //  双重修复:属性名和属性值都需要处理
                        var fixedName = FixEncoding(prop.Name);
                        writer.WritePropertyName(fixedName);
                        WriteFixedValue(prop.Value, writer);
                    }
                    writer.WriteEndObject();
                    break;

                case JsonValueKind.Array:
                    writer.WriteStartArray();
                    foreach (JsonElement item in element.EnumerateArray())
                    {
                        //  递归处理数组元素
                        WriteFixedValue(item, writer);
                    }
                    writer.WriteEndArray();
                    break;

                case JsonValueKind.String:
                    //  核心修复点:字符串值修复
                    writer.WriteStringValue(FixEncoding(element.GetString()));
                    break;

                default:
                    // ⚙️ 非字符串类型直接写入(数字/布尔值/null等)
                    element.WriteTo(writer);
                 China编程   break;
            }
        }
    }
}

代码说明

1.FixEncoding方法:

这是核心修复方法,用于修复单个乱码字符串。

它通过将错误解码的字符串重新编码为字节数组,然后用正确的编码重新解析,从而恢复原始字符串。

2.FixJsonEncoding方法:

这个方法用于修复整个JSON对象。

它使用JsonDocument解析JSON,然后深度遍历所有节点,修复每个字符串值。

最后,它通过Utf8JsonWriter重建JSON结构,保持格式不变。

3.WriteFixedValue方法:

这是一个递归方法,用于深度遍历JSON对象或数组。

它会修复每个字符串值,并正确处理其他类型的节点(如数字、布尔值、null等)。

使用示例

以下是一个简单的使用示例:

using System;

namespace ExampleUsage
{
    class Program
    {
        static void Main(string[] args)
        {
            string garbledText = "—"; // 示例乱码文本
            string yourCorruptedJson = "{\"name\":\"—\",\"age\":30}";

            // 修复单个字符串
            string fixedString = JsonEncodingFixer.FixEncoding(garbledText);
            Console.WriteLine($"修复后的字符串: {fixedString}")javascript;

            // 修复整个JSON对象
            string fixedJson = JsonEncodingFixer.FixJsonEncoding(yourCorruptedJson);
            Consolwww.chinasem.cne.WriteLine($"修复后的JSON: {fixedJson}");
        }
    }
}

输出结果将是修复后的正确JSON字符串。

总结

JsonEncodingFixer是一个简单而强大的工具类,可以帮助我们快速修复JSON乱码问题。它适用于各种因编码错误导致的乱码场景,能够显著提高开发效率。如果你在项目中遇到类似的乱码问题,不妨尝试使用这个工具类。

到此这篇关于基于.NET编写工具类解决JSON乱码问题的文章就介绍到这了,更多相关.NET解决JSON乱码内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于基于.NET编写工具类解决JSON乱码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153646

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col