Newtonsoft C#自定义JsonConverter不反序列化字节数组
我正在尝试创建一个简单的JsonConverter。我希望将字节数组序列化为数字数组,而不是默认的base 64字符串。然而,当我尝试这样做时,我得到了一个JsonSerializationException 下面是我为简化我的问题而制作的一个课程: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
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;
}
}
}