2017-03-17 30 views
1

我有以下代码:JsonConverter字节[]

//模型

public class Home{ 
    public Guid HomeId { get; set; } 
    public Guid UserId { get; set; } 
    public string Name { get; set; } 
    public byte[] Description1 { get; set; } 
    public virtual User User { get; set; } 
} 

public class User 
{ 
    public Guid UserId { get; set; } 
    public string Email { get; set; } 
    public virtual Perfil Perfil { get; set; } 
} 

public class Perfil 
{ 
    public Guid UserId { get; private set; } 
    public string Name { get; private set; } 
    public byte[] Description2 { get; set; } 
} 

// JsonConverter

public class ByteArrayConverter : JsonConverter 
{ 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(byte[]); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 

     var m = Convert.FromBase64String((string)reader.Value); 
     return m; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     byte[] bytes = (byte[])value; 
     writer.WriteValue(Convert.ToBase64String(bytes)); 
    } 
} 

//序列化(调用ByteArrayConverter的WriteJson功能,行)

var serialized = JsonConvert.SerializeObject(obj, settings); 

{ 
"HomeId": "2925362b", 
"UserId": "9ea43c30", 
"Name": "Name 1", 
"Description1": "VABlAHMAdABlAA==", //===> Converts to Base64 (OK) 
"User": { 
    "UserId": "9ea43c30", 
    "Email": "[email protected]", 
    "Perfil": { 
     "UserId": "9ea43c30", 
     "Name": "Name 2", 
     "Description2": "dABlAHMAdABlAA==", //===> Converts to Base64 (OK) 
    } 
} 

}

//反序列

var deserialized = JsonConvert.DeserializeObject<T>(serialized, settings); // T is class Home 

{ 
"HomeId": "2925362b", 
"UserId": "9ea43c30", 
"Name": "Name 1", 
"Description1": "VABlAHMAdABlAA==", //===> Don't Convert from Base64, (**Does not call the ReadJson function of ByteArrayConverter**) 
"User": { 
    "UserId": "9ea43c30", 
    "Email": "[email protected]", 
    "Perfil": { 
     "UserId": "9ea43c30", 
     "Name": "Name 2", 
     "Description2": "dABlAHMAdABlAA==", //===> Convert from Base64 (OK) 
    } 
} 

}

设置

 var settings = new JsonSerializerSettings 
     { 
      TypeNameHandling = TypeNameHandling.Objects, 
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
      Formatting = Formatting.Indented 
     }; 
     settings.Converters.Add(new ByteArrayConverter()); 

的内容描述属性不进入ByteArrayConverter类的ReadJson功能,因此它不会转换回字节[],生成另一个无效的[]字节,....

任何标识这个问题的答案?

+5

你不必ByteArrayConverter? Json.NET原生支持base64的字节数组,请参阅[序列化指南:原始类型](http://www.newtonsoft.com/json/help/html/serializationguide.htm) – dbc

+0

嗨,当我不使用上述,它使用以下信息序列化byte []类型:$ type:“System.Byte [],mscorlib” $ Value:“VABlAHMAdABlAA ==”,但是当我反序列化时,它显示错误:解析值时遇到意外的字符 – Anpeiron

+1

FWIW,没有转换器使用您指定的相同设置,它对我来说工作得很好。 –

回答

0

老问题,但需要澄清

when I do not use as above, it serializes a byte[] type with the information: $ type: "System.Byte [], mscorlib" $ Value: "VABlAHMAdABlAA ==", but when I go deserialize it shows an error: Unexpected character encountered while parsing value

要避免上述错误在反序列化,反序列化中使用以下JSON设置。

TypeNameHandling = TypeNameHandling.None 

TypeNameHandling设置包括类型信息序列化JSON并且使得反序列化JSON

当详情在创建创建类型读取类型信息时读:TypeNameHandling Enumeration

字节的序列[]是Base-64字符串,并且在反序列化时它会再次生成byte []。

在@布赖恩罗杰斯的评论给出你为什么要使用转换器在所有@dbc

你可以找到a complete working example using your code with modification online