我使用 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(使用前将#替换为@)