Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
反序列化base64编码字节数组在2个JSON.net库版本中返回不同的结果_.net_Json.net_Base64 - Fatal编程技术网

反序列化base64编码字节数组在2个JSON.net库版本中返回不同的结果

反序列化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.net v6.0.8.18111中反序列化上述代码会产生错误结果

输出不正确(JSON.net v6.0.8.18111)

我做错什么了吗

注-
问题中的片段是一段复杂代码的一部分,其中数据作为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() }
        };