【问题标题】:Newton Soft Json JsonSerializerSettings for object with Property as byte array具有属性的对象的 Newton Soft Json JsonSerializerSettings 作为字节数组
【发布时间】:2012-08-06 13:14:24
【问题描述】:

使用 Newton.Json 进行 Json 序列化。 什么 JsonSerializerSettings 应用,当我必须 Json 序列化具有属性为字节数组的对象,然后以十六进制格式显示字节数组时..

例如

class A
{
  public int X {get;set;}
  public byte[] Y {get;set;}  
}

当我将 A 序列化为 json 时,我没有得到 Y 的值,因为我设置了 ... byte[] 的输出应该是十六进制的

【问题讨论】:

标签: c#


【解决方案1】:
var json = JsonConvert.SerializeObject(new MyTestClass());

public class MyTestClass
{
    public string s = "iiiii";

    [JsonConverter(typeof(ByteArrayConvertor))]
    public byte[] buf = new byte[] {1,2,3,4,5};
}

public class ByteArrayConvertor : Newtonsoft.Json.JsonConverter
{

    public override bool CanConvert(Type objectType)
    {
        return objectType==typeof(byte[]);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        byte[] arr = (byte[])value;
        writer.WriteRaw(BitConverter.ToString(arr).Replace("-", ""));
    }
}

【讨论】:

  • 我必须将“WriteRaw”更改为“WriteValue”才能使其正常工作。
【解决方案2】:

只需在 JsonSerializerSettings 中覆盖转换器,优于属性中的属性

private class SerializationTest
{
    public byte[] Bytes => new byte[] { 11, 22, 33, 44, 0xAA, 0xBB, 0xCC };
}

private class ByteArrayHexConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(byte[]);

    public override bool CanRead => false;
    public override bool CanWrite => true;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => throw new NotImplementedException();

    private readonly string _separator;

    public ByteArrayHexConverter(string separator = ",") => _separator = separator;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var hexString = string.Join(_separator, ((byte[])value).Select(p => p.ToString("X2")));
        writer.WriteValue(hexString);
    }
}

private static void Main(string[] args)
{
    var setting = new JsonSerializerSettings { Converters = { new ByteArrayHexConverter() } };
    var json = JsonConvert.SerializeObject(new SerializationTest(), setting);
    Console.WriteLine(json); // {"Bytes":"0B,16,21,2C,AA,BB,CC"}
}

【讨论】:

    【解决方案3】:

    包括序列化和反序列化

        public class A
        {
            public int X { get; set; }
    
            [JsonProperty(ItemConverterType = typeof(BytesToHexConverter))]
            public byte[] Y { get; set; }
        }
    
        public class BytesToHexConverter : JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(byte[]);
            }
    
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                if (reader.TokenType == JsonToken.String)
                {
                    var hex = serializer.Deserialize<string>(reader);
                    if (!string.IsNullOrEmpty(hex))
                    {
                        return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
                    }
                }
                return Enumerable.Empty<byte>();
            }
    
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                var bytes = value as byte[];
                var @string = BitConverter.ToString(bytes).Replace("-", string.Empty);
                serializer.Serialize(writer, @string);
            }
        }
    
        public static void Main(string[] args)
        {
            var a = new A() { X = 1001, Y = new byte[] { 0, 1, 4, 8 } };
            var s = new JsonSerializer();
    
            var sb = new StringBuilder();
            var sw = new StringWriter(sb);
    
            s.Converters.Add(new BytesToHexConverter());
            s.Serialize(sw, a);
            var json = sb.ToString();
    
            var sr = new StringReader(json);
            var readback = s.Deserialize(sr, typeof(A));
    
            Console.WriteLine(sw);
            Console.WriteLine("End...");
            Console.ReadLine();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多