我希望将我的模型转换为json,并且它有一个byte[]数组,在转换为json时,该数组被转换为Base64字符串.我不想将byte[]数组转换为字符串格式.

以下是我try 过的方法

       MyModel myObject = new MyModel
        {
            Id = 1,                
            Data = new byte[] { 0x01, 0x02, 0x03 }
        };
        string json = JsonSerializer.Serialize(myObject, options);

It returns the output as Json string output

我想要{"Id":[1],"Data":[1,2,3]}的yields .

Edit:个 我在PowerShell脚本中有上面的代码,可以做同样的事情

$CertificateJsonString = ConvertTo-Json $CertificateVaultObject -Compress
$CertificateSecureString = ConvertTo-SecureString -String $CertificateJsonString -AsPlainText –Force

推荐答案

Json(和Json.NET)只将byte arrays序列化为Base64,因此,如果您将Data声明为某个其他集合或可枚举的字节(但不是object),它将被序列化为JSON数组,例如:

public class MyModel
{
    public int Id { get; set; }
    public IEnumerable<byte>? Data { get; set; }
}

当通过以下方式序列化时:

MyModel myObject = new MyModel
{
    Id = 1,                
    Data = new byte[] { 0x01, 0x02, 0x03 }
};
string json = JsonSerializer.Serialize(myObject, options);

结果是:

{"Id":1,"Data":[1,2,3]}

演示小提琴#1here.

或者,如果您不能更改您的模型,您可以引入一个JsonConverter<byte>,它将byte []值作为一个数组进行往返:

public class ByteArrayConverter : JsonConverter<byte []>
{
    public override void Write(Utf8JsonWriter writer, byte [] value, JsonSerializerOptions options) =>
        JsonSerializer.Serialize(writer, value.AsEnumerable());
    
    public override byte []? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
        reader.TokenType switch
        {
            JsonTokenType.String => reader.GetBytesFromBase64(),
            JsonTokenType.StartArray => JsonSerializer.Deserialize<List<byte>>(ref reader)!.ToArray(),
            JsonTokenType.Null => null,
            _ => throw new JsonException(),
        };
}

并像这样序列化:

MyModel myObject = new MyModel
{
    Id = 1,                
    Data = new byte[] { 0x01, 0x02, 0x03 }
};
var options = new JsonSerializerOptions { Converters = { new ByteArrayConverter() } };
string json = JsonSerializer.Serialize(myObject, options);

也会得到同样的结果.

演示小提琴#2here.

备注:

Csharp相关问答推荐

无法使用命令提示符创建空的dotnet核心Web应用程序

需要深入了解NpgSQL DateTimeOffset处理

C#相同名称的枚举方法和normal方法,参数类型不同

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

实体核心框架--HasColumnType和HasPrecision有什么不同?

Polly v8—使用PredicateBuilder重试特定的状态代码

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

无法通过绑定禁用条目

使用带有WithAppOnly()请求选项的pageIterator

如何从ASP.NET核心MVC视图和Blazor传递数据

如何在C#中转换泛型包装类内部的派生类

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

.NET:从XPath定位原始XML文档中的 node

使用System.Text.Json进行序列化时发生StackOverflow异常

C#静态抽象属性不能被子接口覆盖

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

使用C#12中的主构造函数进行空判断

如何使用LINQ在C#中填充列表列表?