2017-06-05 47 views
2

我有一个具有许多公共属性的对象,其中一个是图像类型。我试图使用json.net对此进行序列化,并假定我将需要base64对此进行编码并对结果字符串进行序列化。我有对财产的BinaryConverter尝试没有成功以下如何使用包含图像属性的json.net将对象序列化为json

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(); 

“写入二进制时预期的值类型为”我得到一个异常。任何帮助都会非常有帮助,因为我一直在网上搜索一段时间,但没有成功。

+2

会不会更好地返回链接到图像? – derloopkat

回答

3

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); 
    } 
} 

然后,它都将序列化和反序列化类就好了。

+0

谢谢Evk - 这个作品完美 –

3

我想在这种情况下,建议将图像转换为Base64,然后将其序列化,这里的如何做到这一点在C#中的例子:Convert Image to Base64

相关问题