2011-09-28 49 views
3

我无法控制的原因,我已经将数据从外部服务回来被格式化为一个字符串数组的数组:[["string_one", "string_two"]]如何配置Json.NET自定义序列化?

我想有两个属性,反序列化到对象是:

public class MyObject 
{ 
    public string PropertyOne { get; set; } 
    public string PropertyTwo { get; set; } 
} 

我使用Json.NET进行所有JSON序列化/反序列化。当我尝试转换字符串数组的数组时,我得到一个异常,说JsonArray不能转换为MyObject。什么是实施这个的适当方式?

回答

2

使用JsonConverter结束实现此操作。我改变为MyObject的样子:

[JsonConverter(typeof(MyObjectConverter))] 
public class MyObject 
{ 
    public string PropertyOne { get; set; } 
    public string PropertyTwo { get; set; } 
} 

然后实施MyObjectConverter:

public class MyObjectConverter : JsonConverter 
{ 
    public override object ReadJson (JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) 
    { 
     int pos = 0; 
     string[] objectIdParts = new string[2]; 

     while (reader.Read()) 
     { 
      if (pos < 1) 
      { 
       if (reader.TokenType == JsonToken.String) 
       { 
        objectIdParts[pos] = reader.Value.ToString(); 
        pos++; 
       } 
      } 
      // read until the end of the JsonReader 
     } 

     return new MyObject(objectIdParts); 
    } 

    public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanWrite { 
     get { 
      return base.CanWrite; 
     } 
    } 

    public override bool CanRead { get { return true; } } 
    public override bool CanConvert (Type objectType) 
    { 
     return true; 
    } 
} 
1

老实说,我只是将其反序列化为string[][]并将其映射到您的域图层中。您花费在自定义序列化上的时间量很少值得。

+1

我不喜欢回答这样的B/C它并不能帮助谁拥有这个通用的问题,谁就会在阅读这个答案的人未来... –

+0

@亨利 - 幸运的是有不止一个答案可供选择;) –

2

您的目标对象和JSON之间存在相当大的差异。您可以手动执行映射:

string json = "[[\"string_one\", \"string_two\"]]"; 
dynamic result = JsonConvert.DeserializeObject(json); 
var myObject = new MyObject 
{ 
    PropertyOne = result[0][0], 
    PropertyTwo = result[0][1] 
}; 
+0

不幸的是,这种差异是不可避免的。 –