场景
最近在做一个关于OPC项目,项目中把对象序列化成Json,使用了Newtonsoft.Json插件,当序列化byte数组时,发现byte[] 被序列化成一个字符串,在浏览官方文档时,发现可以针对特定类型写相应的转换器。
解决方案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
namespace ConsoleApp2
{
internal class Program
{
private static void Main(string[] args)
{
var data = new Demo {Data = new byte[] {1, 3, 4}};
var error = JsonConvert.SerializeObject(data);
Console.Write("error json:");
ShowError(error);
Console.WriteLine();
var setting = new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new JsonByteArrayConverter()
}
};
var json = JsonConvert.SerializeObject(data, setting);
Console.WriteLine($"correct json:{json}");
Console.ReadKey();
}
private static void ShowError(string input)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(input);
Console.ForegroundColor = ConsoleColor.White;
}
}
internal class Demo
{
[JsonProperty("data")]
public byte[] Data { get; set; }
}
public class JsonByteArrayConverter : JsonConverter
{
/// <summary>
/// 写入Json数据
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="serializer"></param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var result = new StringBuilder();
if (value is byte[] temp)
foreach (var item in temp)
result.AppendFormat("{0},", item);
writer.WriteValue($"[{result.ToString().Trim(',')}]");
}
/// <summary>
/// 读Json数据
/// </summary>
/// <param name="reader"></param>
/// <param name="objectType"></param>
/// <param name="existingValue"></param>
/// <param name="serializer"></param>
/// <returns></returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var strValue = reader.Value.ToString();
var temp = strValue.Split(',');
return temp.Select(x => byte.Parse(x)).ToArray();
}
/// <summary>
/// 是否可以转换
/// </summary>
/// <param name="objectType"></param>
/// <returns></returns>
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
}
}