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.
备注: