如何使用包含图像属性的www.example.com将对象序列化为jsonjson.net

svgewumm  于 2023-01-06  发布在  .NET
关注(0)|答案(3)|浏览(138)

我有一个对象,该对象具有多个公共属性,其中一个属性的类型为image。我尝试使用www.example.com对其进行序列化json.net,并假设我需要对其进行base64编码并序列化生成的字符串。我已尝试使用BinaryConverter对以下属性进行处理,但未成功

public class Person
{
    public string name { get; set; }

    public int age { get; set; }

    [JsonConverter(typeof(BinaryConverter))]
    public Image photo { get; set; }

    public string ToJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

使用此测试代码调用时...

var p = new Person();
p.name = "John Doe";
p.age = 99;
p.photo = Image.FromFile(@"dea4007a-c812-41e9-b09a-c7793c6e853d.jpg");

var json = p.ToJson();
Console.WriteLine(json);
Console.ReadKey();

我得到一个异常“写二进制时意外的值类型”。任何帮助都会非常有帮助,因为我已经在网上搜索了一段时间,现在没有成功。

eqoofvh9

eqoofvh91#

Json.NET不知道什么是Image,所以你必须帮助它,例如使用一个转换器(BinaryConverter不适用于图像):

public class ImageConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        var base64 = (string)reader.Value;
        // convert base64 to byte array, put that into memory stream and feed to image
        return Image.FromStream(new MemoryStream(Convert.FromBase64String(base64)));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var image = (Image) value;
        // save to memory stream in original format
        var ms = new MemoryStream();
        image.Save(ms, image.RawFormat);
        byte[] imageBytes = ms.ToArray();
        // write byte array, will be converted to base64 by JSON.NET
        writer.WriteValue(imageBytes);
    }

    public override bool CanConvert(Type objectType) {
        return objectType == typeof(Image);
    }
}

public class Person
{
    public string name { get; set; }

    public int age { get; set; }

    [JsonConverter(typeof(ImageConverter))]
    public Image photo { get; set; }

    public string ToJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

然后,它将很好地序列化和反序列化您的类。

5f0d552i

5f0d552i2#

在这种情况下,我建议将图像转换为base64,然后将其序列化,下面是一个如何在C#中执行此操作的示例:Convert Image to Base64

ltskdhd1

ltskdhd13#

按如下所示构造JSONConverter类:

public class ImageJsonConverter
        : JsonConverter<Image>
    {

        public override void WriteJson(JsonWriter writer, Image value, JsonSerializer serializer)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }

            // Save to memory stream in original format.
            using (MemoryStream ms = new MemoryStream())
            {
                Image image = value;
                image.Save(ms, image.RawFormat);
                byte[] imageBytes = ms.ToArray();

                // Write byte array, will be converted to base64 by JSON.NET.
                writer.WriteValue(imageBytes);
            }
        }
        public override Image ReadJson(JsonReader reader, Type objectType, Image existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.String)
            {
                string base64 = reader.Value?.ToString();
                if (string.IsNullOrEmpty(base64))
                {
                    return null;
                }

                // Convert base64 to byte array,
                // put that into memory stream and feed to image.
                return Image.FromStream(new MemoryStream(Convert.FromBase64String(base64)));
            }
            return null;
        }

    }

然后使用JsonConverterAttribute指定在序列化和反序列化属性时应使用JsonConverter。

public class Person
{
    public string name { get; set; }
    public int age { get; set; }

    [JsonConverter(typeof(ImageJsonConverter))]
    public Image photo { get; set; }

    public string ToJson()
    {
        return JsonConvert.SerializeObject(this);
    }
}

相关问题