c# - Newtonsoft.Json 反序列化 base64 图像失败

标签 c# .net json image

我正在使用 Newtonsoft.Json 将我的网络服务的输出反序列化为一个对象。 在我添加 Bitmap 之前它工作正常我的类(class)的属性(property)(名为 User )来持有一个化身。

Web 服务将该属性作为 Base64 字符串返回,这是预期的。 问题是当我尝试将 JSON 从 WS 转换回 List<User> 时, 一个 JsonSerializationException被扔在这段代码中:

// 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.FromBase64String获取字节数组并从中加载位图。然后我想更新我的问题以询问如何我可以跳过或手动解析该字段。 我想避免必须手动解析所有 JSON。 这可能吗?

编辑 2 我发现了根本问题:JSON 在 web 服务中没有被正确序列化(我不明白为什么)。我以为this是一个有点不同的问题,但没有。我的网络服务只是返回一个字符串 "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()));
    }
}

关于c# - Newtonsoft.Json 反序列化 base64 图像失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510742/

相关文章:

javascript - 在 $http post 请求 header 或正文中插入自定义变量

c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object'

c# - MSBuild error opening vs2017 csproj files (The tools version "15.0"is unrecognized...)

javascript - 在 Javascript 中添加数组对象中对象的值

json - 使用带有 map 的LowDB访问嵌套的Json值

javascript - JSON 按值获取项目

c# - 在 LINQ to Entities 中按周分组

ASP.NET 编译器更新到版本 5.2.2 后无法加载 System.Web.Mvc

javascript - 为什么我无法将毫秒从 C# 转换为 JavaScript 日期对象?

c# - Android 中的 MVVM 交叉绑定(bind)