如何将 byte[] 序列化为简单的 JSON 数组而不是 JSON.net 中的 base64?

2024-03-14

我使用 JSON.net 在 C# 和 JavaScript 之间序列化一些对象。 JSON 数据通过 WebSocket 在 .NET 和浏览器应用程序之间传输。

数据结构中有一些byte[]字段,我希望这些字段作为Array在 JavaScript 中也是如此。

如何序列化 C#byte[]到一个简单的 JSON 数组,例如[ 0 , 1 , 254, 255 ]而不是 Base64 字符串?


JSON.NET 正在选择BinaryConverter读取和写入字节数组。你可以看到在来源 https://github.com/JamesNK/Newtonsoft.Json/blob/92d170a0783bc962f52faf02acfcecbe21d3b683/Src/Newtonsoft.Json/Converters/BinaryConverter.cs#L64它使用WriteValue操作于JsonWriter具有字节数组的类,这导致它们被写入为 Base-64。

要修改它,您可以编写自己的转换器,以您期望的格式读取和写入数组:

public class ByteArrayConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer,
        object value,
        JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteNull();
            return;
        }

        byte[] data = (byte[])value;

        // Compose an array.
        writer.WriteStartArray();

        for (var i = 0; i < data.Length; i++)
        {
            writer.WriteValue(data[i]);
        }

        writer.WriteEndArray();
    }

    public override object ReadJson(
        JsonReader reader,
        Type objectType,
        object existingValue,
        JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
        {
            var byteList = new List<byte>();

            while (reader.Read())
            {
                switch (reader.TokenType)
                {
                    case JsonToken.Integer:
                        byteList.Add(Convert.ToByte(reader.Value));
                        break;
                    case JsonToken.EndArray:
                        return byteList.ToArray();
                    case JsonToken.Comment:
                        // skip
                        break;
                    default:
                        throw new Exception(
                        string.Format(
                            "Unexpected token when reading bytes: {0}",
                            reader.TokenType));
                }
            }

            throw new Exception("Unexpected end when reading bytes.");
        }
        else
        {
            throw new Exception(
                string.Format(
                    "Unexpected token parsing binary. "
                    + "Expected StartArray, got {0}.",
                    reader.TokenType));
        }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(byte[]);
    }
}

您可以通过应用来使用它JsonConverterAttribute致会员:

[JsonConverter(typeof(ByteArrayConverter))]
public byte[] Data { get; set; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 byte[] 序列化为简单的 JSON 数组而不是 JSON.net 中的 base64? 的相关文章

  • 如何使用 JavaScript 选择预节点/块中的文本?

    我了解不允许 JS 将任意文本复制到剪贴板背后的安全原因 但是是否有一种方法可以通过单击按钮来选择预节点中的文本 类似于 select 函数在输入中的工作方式 我不是在寻找复制到剪贴板的 jQuery 插件 我只想突出显示预块中的文本 以便
  • 如何在 Sequelize ORM 中限制连接行(多对多关联)?

    Sequelize 定义了两种模型 具有多对多关联的 Post 和 Tag Post belongsToMany db Tag through post tag foreignKey post id timestamps false Tag
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • React 应用程序中的 addEventListener 不起作用

    一些背景 我正在尝试消费自定义网络组件在 React 应用程序中并尝试监听来自 Web 组件的事件 我相信您不能只在自定义 Web 组件上以通常的反应方式处理事件 i e
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • 游戏手柄 JavaScript 未能按预期更新

    我正在尝试让浏览器报告我的 XBOX 控制器的状态 然而 在第一次按下按钮后 它似乎变得 卡住 我究竟做错了什么
  • setInterval() 在用户离开选项卡时暂停?

    javascript 中是否有任何方法的行为类似于 setInterval 并且当用户离开选项卡时停止并在用户再次进入选项卡时恢复 您可以使用以下方法创建自己的 API可见性API https developer mozilla org e
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • put方法中的Angularjs文件上传不起作用

    我有一个简单的待办事项应用程序 我试图在其中上传照片和单个待办事项 现在我已经创建了这个工厂函数来负责待办事项的创建 todosFactory insertTodo function todo return http post baseUr
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • ReactJs 警告:不推荐使用改变“style”。考虑事先克隆它

    我收到以下警告 inWarning div was passed a style object that has previously been mutated Mutating style is deprecated Consider c
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐

  • 用 Git 寻找分支点?

    我有一个包含 master 和 A 分支的存储库 以及两者之间的大量合并活动 当基于master创建分支A时 如何在我的存储库中找到提交 我的存储库基本上如下所示 X A B C D F master G H I J branch A 我正
  • 如何访问作为参数传递给 C# 中通用函数的对象的方法

    我有一个通用方法 它具有一些通用类型的参数 我想要做的是能够访问我的函数内这个泛型类型参数的方法 public void dispatchEvent
  • 为什么“git submodule update”会跳过子模块?

    我有一个带有单个子模块的 git 存储库sub x 该子模块不包含其自己的任何子模块 在超级项目的存储库中 输出git status显示以下 未暂存的 修改 modified sub x new commits 如果我现在跑步 git su
  • 鼠标交互的设计模式

    我需要一些关于什么是通用鼠标的 理想 设计模式的意见 相互作用 这里是简化的问题 我有一个小型 3d 程序 QT 和 openGL 并且 我使用鼠标进行交互 每一次互动通常不仅仅是一次 单个函数调用 主要由最多 3 个函数调用 启动 执行
  • EmailAddressAttribute 不需要

    我有一个 EmailAddress 来自 net 4 5 的模型属性上的 DataAnnotation 它返回一个 电子邮件字段不是有效的电子邮件地址 当 Email 属性为空时 验证期间出错 虽然这在技术上是正确的 但我预计这个空值只能用
  • Rails sort_by 方法有两个字段,一个按升序排序,一个按降序排序

    我想渲染一个按分数排序的部分 然后按名称排序 如果多个玩家具有相同的分数 现在我正在使用这个 这是可行的 但它按升序对分数进行排序 而我想按降序对它们进行排序 如何翻转分数的排序顺序 但不翻转名称的排序顺序 我仍然想按升序排序 Thanks
  • 在 JPA 2.0 JPQL 中,当返回一个 NEW 对象时,如何使用 FETCH JOIN?

    我的一位同事有以下 显然无效的 JPQL 查询 SELECT NEW com foobar jpa DonationAllocationDTOEntity a id a campaign a campAppeal a campDivisio
  • 从 Excel VBA 运行 Powershell 命令(非脚本)

    我已经搜索过 并且可以找到大量从 VBA 运行 PowerShell 脚本的示例 但我找不到任何仅运行简单命令的示例 例如 这有效 Dim retval As Variant retval Shell PowerShell C MyScri
  • 打印文件中的第一个和最后一个匹配项

    对于以下问题是否有更清洁的解决方案 grep INFO messages head 1 grep INFO messages tail 1 INFO 或消息的长度是随机的 Try grep INFO messages sed n 1p p
  • 将 async/await 与 forEach 循环结合使用

    使用有什么问题吗async await in a forEach环形 我正在尝试循环遍历文件数组并await关于每个文件的内容 import fs from fs promise async function printFiles cons
  • 您是否积极管理技术债务? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 你是否主动管理技术债务 http forums construx com blogs stevemcc archive 2007 11
  • Bash 读取忽略前导空格

    我有文件a txt包含以下内容 aaa bbb 当我执行以下脚本时 while read line do echo line done lt a txt gt b txt 生成的b txt包含以下内容 aaa bbb 可以看出 行的前导空格
  • 如何使用 Perl 将客户端从一个 CGI 页面重定向到另一页面?

    我的问题如下 密码被识别为有效后 我需要重定向到main cgi但我收到的消息是 Status 302 Found Location http localhost cgi bin Main cgi 我知道这样做的原因是我在之后写下这份声明C
  • 如果我使用圆形图像,图像不会显示在 imageView 中

    我有一个表视图 我需要在节标题中显示author img 在 ViewForSectionHeader 方法中 我想让图像成为圆形 但如果我这样做 无论在模拟器中还是在真实设备中 图像都根本不会显示 如果我删除代码 uiimageview
  • 如何从 SELECT 语句输出进度消息?

    我有一个 SQL 脚本 我想在运行时输出进度消息 让它在 SQL 语句之间输出消息很容易 但是我有一些运行时间很长的 INSERT INTO SELECT 有没有办法让 select 语句随时输出消息 例如每 1000 行或每 5 秒输出一
  • Heroku:puppeteer chrome:加载共享库时出错:libX11-xcb.so.1

    使用部署应用程序时出现以下错误react snap到赫罗库 puppeteer local chromium linux 686378 chrome linux chrome error while loading shared libra
  • Clojure 映射限制和一致性

    我想知道 考虑到 Clojure 使用 32 位哈希来实现其映射 因此 Clojure 映射是否有 2 32 1 个键的限制 如果这不是真的 它如何管理冲突 以及它的哈希是否实施是持续的 http en wikipedia org wiki
  • Prolog 的良好初学者材料 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL Workbench 6.1 - 没有插入行的选项?

    MySQL Workbench 5 2 版提供了一个选项 可以通过右键单击表列表中的表名称 以图形方式向表中添加行 MySQL Workbench 6 1 中确实缺少此选项还是隐藏了 在 Ubuntu 13 10 上 MySQL 工作台 6
  • 如何将 byte[] 序列化为简单的 JSON 数组而不是 JSON.net 中的 base64?

    我使用 JSON net 在 C 和 JavaScript 之间序列化一些对象 JSON 数据通过 WebSocket 在 NET 和浏览器应用程序之间传输 数据结构中有一些byte 字段 我希望这些字段作为Array在 JavaScrip