【问题标题】:Byte array serialization in JSON.NETJSON.NET 中的字节数组序列化
【发布时间】:2025-12-31 18:50:01
【问题描述】:

鉴于这个简单的类:

class HasBytes
{
    public byte[] Bytes { get; set; }
}

我可以通过 JSON.NET 将其放入,这样字节数组就是 base-64 编码的:

var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
var json = JsonConvert.SerializeObject(bytes);

然后我可以用这种稍微有点过于复杂的方式再读一遍:

TextReader textReader = new StringReader(json);
JsonReader jsonReader = new JsonTextReader(textReader);
var result = (HasBytes)JsonSerializer.Create(null)
                 .Deserialize(jsonReader, typeof(HasBytes));

一切都好。但是如果我先把jsonReader的内容变成JToken

var jToken = JToken.ReadFrom(jsonReader);

然后通过将其包装在JTokenReader 中,将其转回JsonReader

jsonReader = new JTokenReader(jToken);

然后反序列化抛出异常:“Expected bytes but got string”。

新的 JsonReader 不应该在逻辑上等同于原来的吗?为什么“原始”JsonTextReader 能够将字符串视为 base-64 字节数组,而 JTokenReader 版本却没有?

【问题讨论】:

    标签: serialization bytearray json.net


    【解决方案1】:

    据我所知,这似乎是 JTokenReader 中的一个错误,所以我有 reported it here

    更新:已在 JSON.NET 3.5 第 7 版中修复。

    【讨论】: