当前位置: 代码网 > it编程>编程语言>Javascript > 基于.NET编写工具类解决JSON乱码问题

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

2025年03月05日 Javascript 我要评论
在开发过程中,我们经常会遇到json数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题。这种情况通常发生在原始数据以utf-8编码,却被错误地用gbk等其他编码解码时。为了

在开发过程中,我们经常会遇到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编码修复工具类
    /// 🌟 适用场景:修复因编码错误导致的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());
            }
        }

        /// <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);
                    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}");

            // 修复整个json对象
            string fixedjson = jsonencodingfixer.fixjsonencoding(yourcorruptedjson);
            console.writeline($"修复后的json: {fixedjson}");
        }
    }
}

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

总结

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

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com