Newton Soft Json JsonSerializer使用Property作为字节数组的对象设置

问题描述 投票:2回答:3

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

例如

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

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

c#
3个回答
3
投票
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("-", ""));
    }
}

1
投票

只需覆盖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"}
}

0
投票

包括序列化和反序列化

    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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.