反序列化base64编码字节数组在2个JSON.net库版本中返回不同的结果
在JSON.net v6.0.8.18111中反序列化上述代码会产生错误结果 输出不正确(JSON.net v6.0.8.18111) 我做错什么了吗 注-反序列化base64编码字节数组在2个JSON.net库版本中返回不同的结果,.net,json.net,base64,.net,Json.net,Base64,在JSON.net v6.0.8.18111中反序列化上述代码会产生错误结果 输出不正确(JSON.net v6.0.8.18111) 我做错什么了吗 注- 问题中的片段是一段复杂代码的一部分,其中数据作为JSON参数传入WebMethod,responsearray是发送到WebMethod的复杂对象的一部分,这就是我们使用JSON.net库进行解码的原因。问题是JObject已经将aaaaaaaaaaaaaaaaaaaaaaaa解析为string(j[“responseArray”].Typ
问题中的片段是一段复杂代码的一部分,其中数据作为JSON参数传入WebMethod,responsearray是发送到WebMethod的复杂对象的一部分,这就是我们使用JSON.net库进行解码的原因。问题是
JObject
已经将aaaaaaaaaaaaaaaaaaaaaaaa
解析为string
(j[“responseArray”].Type
=JTokenType.string
),因此j[“responseArray”].tobject
没有进行反base64
您必须将其直接解析为字节[]
,如:
r= {byte[16]}
[0]: 170
[1]: 170
[2]: 170
[3]: 170
[4]: 170
[5]: 170
[6]: 170
[7]: 170
[8]: 170
[9]: 170
[10]: 170
[11]: 170
[12]: 170
[13]: 171
[14]: 170
[15]: 170
更新 这是我的 原始答案 这是一个Json.NET问题。问题是您的字符串
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
在此回溯中:
if (s.Length == 0)
{
data = new byte[0];
}
else if (ConvertUtils.TryConvertGuid(s, out g))
{
data = g.ToByteArray();
}
else
{
data = Convert.FromBase64String(s);
}
然后,要全局设置它:
public class ByteConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
public override bool CanWrite { get { return false; } } // Use the default implementation for serialization, which is not broken.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = (string)JToken.Load(reader);
if (value == null)
return null;
if (value.Length == 0)
return new byte[0];
return Convert.FromBase64String(value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
JsonConvert.DefaultSettings=()=>新的JsonSerializerSettings
{
转换器=新列表{new ByteConverter()}
};
此解决方法可恢复字节数组的正确反序列化。如果您提供详细信息,将有所帮助。例如:“…给出错误的结果…”-什么结果,为什么它是错误的。或者,“…错误地接受了这个…”-这里的“这个”是什么?编辑问题使其更具体我编辑问题使其更具体。我认为Convert.FromBase64String((string)j[“responseArray”]);不符合我们这里的要求。@ruhaimizet如果您可以执行j[“responseArray”]
则可以执行转换。从Base64String((string)j[“responseArray”])
。无法简单地使用JObject.Parse
来直接反序列化字节[]
@Ruhaim如果您感兴趣,6.0.4中已经引入了bug/功能。直到6.0.3,它的工作方式与您预期的一样。您可能可以去github编写它们。问题页面是@RuhaimIzmeth,但我看到您几个小时前就已经这样做了:-)不过,您可以在等待修复时使用6.0.3,它将正常工作。它还没有在beta 7.0中修复。*branchThanks for the research mate:),我在githubNice中看到了您的评论,并建议了一个很好的解决方法+1 :)
public class MyObject
{
public byte[] responseArray { get; set; }
}
MyObject cl = JsonConvert.DeserializeObject<MyObject>("{'responseArray':'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA'}");
JObject j = JObject.Parse("{'responseArray':'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA'}");
byte[] r = Convert.FromBase64String((string)j["responseArray"]);
if (s.Length == 0)
{
data = new byte[0];
}
else if (ConvertUtils.TryConvertGuid(s, out g))
{
data = g.ToByteArray();
}
else
{
data = Convert.FromBase64String(s);
}
Newtonsoft.Json.JsonReader.ReadAsBytesInternal() Line 517 C#
Newtonsoft.Json.Linq.JTokenReader.ReadAsBytes() Line 74 + 0x9 bytes C#
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(Newtonsoft.Json.JsonReader reader = {Newtonsoft.Json.Linq.JTokenReader}, Newtonsoft.Json.Serialization.JsonContract contract = {Newtonsoft.Json.Serialization.JsonPrimitiveContract}, bool hasConverter = false) Line 1853 + 0x8 bytes C#
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonReader reader = {Newtonsoft.Json.Linq.JTokenReader}, System.Type objectType = {Name = "Byte[]" FullName = "System.Byte[]"}, bool checkAdditionalContent = false) Line 144 + 0x2f bytes C#
Newtonsoft.Json.JsonSerializer.DeserializeInternal(Newtonsoft.Json.JsonReader reader = {Newtonsoft.Json.Linq.JTokenReader}, System.Type objectType = {Name = "Byte[]" FullName = "System.Byte[]"}) Line 710 + 0x52 bytes C#
Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader reader = {Newtonsoft.Json.Linq.JTokenReader}, System.Type objectType = {Name = "Byte[]" FullName = "System.Byte[]"}) Line 689 + 0x11 bytes C#
Newtonsoft.Json.Linq.JToken.ToObject(System.Type objectType = {Name = "Byte[]" FullName = "System.Byte[]"}, Newtonsoft.Json.JsonSerializer jsonSerializer = {Newtonsoft.Json.JsonSerializer}) Line 1837 + 0x11 bytes C#
Newtonsoft.Json.Linq.JToken.ToObject(System.Type objectType = {Name = "Byte[]" FullName = "System.Byte[]"}) Line 1811 + 0x3c bytes C#
Newtonsoft.Json.Linq.JToken.ToObject<byte[]>() Line 1698 + 0x39 bytes C#
public class ByteConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
public override bool CanWrite { get { return false; } } // Use the default implementation for serialization, which is not broken.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var value = (string)JToken.Load(reader);
if (value == null)
return null;
if (value.Length == 0)
return new byte[0];
return Convert.FromBase64String(value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new ByteConverter() }
};