Cập nhật
Đây là fixed trong Json.NET 7.0 Release 1.
gốc trả lời
Đây là một vấn đề Json.NET. Vấn đề là chuỗi của bạn AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA
chỉ xảy ra là thành công được phân tách như một GUID, trong JsonReader.ReadAsBytesInternal()
:
if (s.Length == 0)
{
data = new byte[0];
}
else if (ConvertUtils.TryConvertGuid(s, out g))
{
data = g.ToByteArray();
}
else
{
data = Convert.FromBase64String(s);
}
Tại traceback này:
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#
Như bạn có thể thấy, đây ngắn mạch cơ sở 64 giải mã. Lỗi xấu xí, và thay vào đó là may mắn về phía bạn để có được chuỗi chính xác đó.
Để chặn nhận dạng GUID không phù hợp của Json.NET, bạn có thể tạo toàn bộ JsonConverter
toàn cầu của mình cho mảng byte. Khi bạn làm thế, Json.NET sẽ vượt qua cho bạn những chuỗi nguyên mà không có sự "hữu ích" mô hình phù hợp GUID:
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();
}
}
Và sau đó, để thiết lập nó trên toàn cầu:
JsonConvert.DefaultSettings =() => new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new ByteConverter() }
};
workaround này khôi phục deserialization đúng cho mảng byte.
Sẽ hữu ích nếu bạn cung cấp chi tiết cụ thể. Ví dụ. "... cho kết quả sai ..." - kết quả là gì, tại sao nó sai. Hoặc, "... lấy sai lầm này ..." - "cái này" ở đây là gì? –
đã chỉnh sửa câu hỏi cụ thể hơn –