当前位置: 首页 > 面试题库 >

Newtonsoft.Json反序列化base64映像失败

曾成天
2023-03-14
问题内容

我正在使用Newtonsoft.Json将Web服务的输出反序列化到对象。在我Bitmap向我的课程(名为User)添加一个属性以保存化身之前,它一直运行良好。

Web服务正按预期返回该属性作为Base64字符串。问题是当我尝试将JSON从WS转换回a时List<User>JsonSerializationException在此代码块中引发了a

// T is IList<User>
response.Content.ReadAsStringAsync().Proceed(
    (readTask) =>
    {
        var json = ((Task<string>)readTask).Result;
        var result = JsonConvert.DeserializeObject<T>(json); //<-- it fails here

         // do stuff! 
     });

异常的输出是:

Error converting value "System.Drawing.Bitmap" to type 'System.Drawing.Bitmap'. Path '[2].Avatar

并查看内部异常:

{"Could not cast or convert from System.String to System.Drawing.Bitmap."}

显然,它无法解析Base64字符串,但不清楚原因。

有任何想法/解决方法吗?

编辑 我知道我可以使用Convert.FromBase64Stringdo获取字节数组并从中加载位图。然后,我想更新我的问题,询问 如何
跳过或手动 解析该字段。我想避免,必须手动解析所有JSON。这有可能吗?

编辑2
我发现了根本问题:JSON没有在Web服务中正确序列化(并且我看不出为什么)。我认为这是一个有点不同的问题,但是没有。我的Web服务只是返回一个字符串,"System.Drawing.Bitmap"而不是其base64内容。因此JsonSerializationException

我一直无法解决该问题,我发现的唯一解决方案是将自己的领域变成byte []


问题答案:

将该字段读取为字符串,

使用Convert.FromBase64String和转换为字节数组

使用获取图像 Bitmap.FromStream(new MemoryStream(bytearray));

编辑

您可以在自定义 转换器 的帮助下执行图像序列化/反序列化 __

public class AClass
{
    public Bitmap image;
    public int i;
}

Bitmap bmp = (Bitmap)Bitmap.FromFile(@"......");
var json = JsonConvert.SerializeObject(new AClass() { image = bmp, i = 666 }, 
                                       new ImageConverter());

var aclass = JsonConvert.DeserializeObject<AClass>(json, new ImageConverter());

这是 ImageConverter

public class ImageConverter : Newtonsoft.Json.JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Bitmap);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var m = new MemoryStream(Convert.FromBase64String((string)reader.Value));
        return (Bitmap)Bitmap.FromStream(m);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Bitmap bmp = (Bitmap)value;
        MemoryStream m = new MemoryStream();
        bmp.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);

        writer.WriteValue(Convert.ToBase64String(m.ToArray()));
    }
}


 类似资料:
  • 我试图序列化和反序列化类的列表(vb),显然里面只有派生类的实例。 我用修饰了list参数,获得如下输出: 但是当我反序列化它时,我一直说他不能反序列化抽象类。 http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm 删除注释行它可以工作!

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • 我对Jackson有一个错误的理解,就是将json文件反序列化为poco。这是我的代码: 我的POCO命名为AnimalBean: }还有我的JSON文件: } 当我执行我的代码时,我有以下错误:未识别的字段“动物园”(类动画豆),未标记为可忽略的。我知道问题是我的json文件开始不直接由动物,但我不能改变它,因为它不是我的。我已经尝试把对象apper.configure(Deseriazatio

  • 目前,我正在使用Avro1.8.0序列化/反序列化对象,但面临一些问题,特别是java.util.Map对象。不面临其他类型对象的问题。 这里的示例代码- 在deserialize方法中,我试图根据输入数据获取模式,但avro抛出错误- 多谢了。

  • 我正在尝试使用apache camel jackson xml对xml进行反序列化,然后发生了一些奇怪的事情,我无法解释。这是我正在尝试反序列化的xml(它是简单的xmltd v xml文件): 这是我的POJO: 电视。Java语言 程序Java语言 Credits.java 其他POJO并不重要。下面是路由配置: 使用此设置和我在开始时提供的xml,会发生以下异常: 通用域名格式。faster