[英]How do I Serialize object to json using json.net which contains an image property
我有一個 object,它有許多公共屬性,其中一個是圖像類型。 我正在嘗試使用 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();
我得到一個異常“寫入二進制文件時出現意外的值類型”。 任何幫助都會非常有幫助,因為我一直在搜索 web 一段時間但沒有成功。
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);
}
}
然后它會很好地序列化和反序列化你的類。
在這種情況下,我建議將圖像轉換為base64,然后將其序列化,這里是一個如何在C#中執行此操作的示例: 將圖像轉換為Base64
構造一個JSONConverter class 如下:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.