Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Newtonsoft C#自定义JsonConverter不反序列化字节数组_C#_Json_Json.net - Fatal编程技术网

Newtonsoft C#自定义JsonConverter不反序列化字节数组

Newtonsoft C#自定义JsonConverter不反序列化字节数组,c#,json,json.net,C#,Json,Json.net,我正在尝试创建一个简单的JsonConverter。我希望将字节数组序列化为数字数组,而不是默认的base 64字符串。然而,当我尝试这样做时,我得到了一个JsonSerializationException 下面是我为简化我的问题而制作的一个课程: public class SomethingFancy { string name; byte[] usefulData; public SomethingFancy(string name, byte[] usefulD

我正在尝试创建一个简单的JsonConverter。我希望将字节数组序列化为数字数组,而不是默认的base 64字符串。然而,当我尝试这样做时,我得到了一个JsonSerializationException

下面是我为简化我的问题而制作的一个课程:

public class SomethingFancy
{
    string name;
    byte[] usefulData;

    public SomethingFancy(string name, byte[] usefulData)
    {
        this.Name = name;
        this.UsefulData = usefulData;
    }

    public string Name { get => name; set => name = value; }
    public byte[] UsefulData { get => usefulData; set => usefulData = value; }
}
下面是我的自定义Json转换器。我试着让它只适用于IEnumerable对象。(默认情况下,序列化时IEnumerable转换为字符串,反序列化时IEnumerable转换为字符串。我更改了该行为,将IEnumerable保存为数字的json数组

public class EnumerableByteConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        var result = typeof(IEnumerable<byte>).IsAssignableFrom(objectType);
        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteValue(value);
        }
        else
        {
            byte[] bytes = ((IEnumerable<byte>)value).ToArray();
            int[] ints = Array.ConvertAll(bytes, c => (int)c);

            writer.WriteStartArray();
            foreach (int number in ints)
            {
                writer.WriteValue(number);
            }
            writer.WriteEndArray();
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        int[] ints = (int[])reader.Value;
        if (ints == null)
            return default;
        else
        {
            byte[] bytes = ints.SelectMany(BitConverter.GetBytes).ToArray();
            if (objectType == typeof(byte[]))
            {
                return bytes;
            }
            var result = new List<byte>(bytes);
            return result;
        }
    }
}
但是,反序列化正在引发JsonSerializationException(反序列化对象时出现意外标记:Integer.Path'UsefulData[0],第4行,位置5)

我错过了什么


谢谢你的帮助。

我用ReadJson方法做的每件事都错了

这是一个定制JsonConverter,适用于与我有相同问题的人:

public class EnumerableByteConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        var result = typeof(IEnumerable<byte>).IsAssignableFrom(objectType);
        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteValue(value);
        }
        else
        {
            byte[] bytes = ((IEnumerable<byte>)value).ToArray();
            int[] ints = Array.ConvertAll(bytes, c => (int)c);

            writer.WriteStartArray();
            foreach (int number in ints)
            {
                writer.WriteValue(number);
            }
            writer.WriteEndArray();
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<int> ints = null;
        if (reader.TokenType == JsonToken.Null)
            return default;
        while (reader.TokenType != JsonToken.EndArray)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                ints = new List<int>();
                reader.Read();
            }
            else if(reader.TokenType == JsonToken.Integer)
            {
                ints.Add(Convert.ToInt32(reader.Value));
                reader.Read();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        if (ints == null)
            return default;
        else
        {
            byte[] bytes = Array.ConvertAll(ints.ToArray(), x => (byte)x);
            if (objectType == typeof(byte[]))
            {
                return bytes;
            }
            var result = new List<byte>(bytes);
            return result;
        }
    }
}
公共类EnumerableByteConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
var result=typeof(IEnumerable).IsAssignableFrom(objectType);
返回结果;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
如果(值==null)
{
writer.WriteValue(值);
}
其他的
{
字节[]字节=((IEnumerable)值).ToArray();
int[]ints=Array.ConvertAll(字节,c=>(int)c);
writer.writestarray();
foreach(整数中的整数编号)
{
writer.WriteValue(数字);
}
writer.WriteEndArray();
}
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
List ints=null;
if(reader.TokenType==JsonToken.Null)
返回默认值;
while(reader.TokenType!=JsonToken.EndArray)
{
if(reader.TokenType==JsonToken.StartArray)
{
ints=新列表();
reader.Read();
}
else if(reader.TokenType==JsonToken.Integer)
{
ints.Add(Convert.ToInt32(reader.Value));
reader.Read();
}
其他的
{
抛出新的InvalidOperationException();
}
}
if(ints==null)
返回默认值;
其他的
{
byte[]bytes=Array.ConvertAll(ints.ToArray(),x=>(byte)x);
if(objectType==typeof(byte[]))
{
返回字节;
}
var结果=新列表(字节);
返回结果;
}
}
}

你应该看看这篇文章,它有一个定制的序列化程序,似乎可以满足你的需要。谢谢!我试过了,它也可以满足我的需要。非常感谢!
{
  "Name": "someName",
  "UsefulData": [
    1,
    2,
    3
  ]
}
public class EnumerableByteConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        var result = typeof(IEnumerable<byte>).IsAssignableFrom(objectType);
        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteValue(value);
        }
        else
        {
            byte[] bytes = ((IEnumerable<byte>)value).ToArray();
            int[] ints = Array.ConvertAll(bytes, c => (int)c);

            writer.WriteStartArray();
            foreach (int number in ints)
            {
                writer.WriteValue(number);
            }
            writer.WriteEndArray();
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<int> ints = null;
        if (reader.TokenType == JsonToken.Null)
            return default;
        while (reader.TokenType != JsonToken.EndArray)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                ints = new List<int>();
                reader.Read();
            }
            else if(reader.TokenType == JsonToken.Integer)
            {
                ints.Add(Convert.ToInt32(reader.Value));
                reader.Read();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        if (ints == null)
            return default;
        else
        {
            byte[] bytes = Array.ConvertAll(ints.ToArray(), x => (byte)x);
            if (objectType == typeof(byte[]))
            {
                return bytes;
            }
            var result = new List<byte>(bytes);
            return result;
        }
    }
}