2013-11-22 51 views
0

我使用Newtonsoft Json库来序列化/反序列化json。例如说我有以下几种类型:Newtonsoft Json DeserializeObject复杂类型

public class Form { 
    public int Id { get; set; } 
} 

public class FormParameters { 
    public Form Form { get; set; } 
} 

现在说我尝试以下方法:

var ex1 = JsonConvert.DeserializeObject("{\"Id\": \"2\"}", typeof(Form)); 

它正确地反序列化对象。但是我想以下工作:

var ex2 = JsonConvert.DeserializeObject("{\"Form\": \"2\"}", typeof(FormParameters)); 

从形式(2在上面的例子中)的值将映射到针对FormParameters类的形式属性的ID。不幸的是,传入反序列化方法的字符串是固定的,我无法更改它。理想情况下,我想向FormParameters类的Form属性添加一个属性。请注意,任何解决方案都不能破坏第一个示例。

我希望我已经解释得很好。我真的很感激帮助。谢谢

+0

不知道我能辨别出这个问题 –

+0

从你给出的答案看,你对我想要达到的目标有一个想法。我添加了一条评论来帮助更好地解释问题。 – nfplee

回答

2

这可以通过自定义JsonConverter来完成。下面是它可能是什么样子:

[JsonConverter(typeof(FormParamsConverter))] 
public class FormParameters 
{ 
    public Form Form { get; set; } 
} 

public class Form 
{ 
    public int Id { get; set; } 
} 

这里是在运行中的转换器中的快速演示:

public class FormParamsConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(FormParameters)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jo = JObject.Load(reader); 
     int id = jo["Form"].Value<int>(); 
     FormParameters fp = new FormParameters 
     { 
      Form = new Form { Id = id } 
     }; 
     return fp; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

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

要使用它,你可以用一个[JsonConverter]属性这样的修饰你的FormParameters类:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = "{\"Form\": \"2\"}"; 

     FormParameters fp = JsonConvert.DeserializeObject<FormParameters>(json); 

     Console.WriteLine("Form Id = " + fp.Form.Id); 
    } 
} 

输出:

Form Id = 2 
+0

谢谢这看起来像我以后。我将无法在明天之前测试它,如果它运行良好,那么我会将其标记为答案。再次感谢。 – nfplee

+0

没问题;乐意效劳。 –

+0

我刚刚开始测试它,它工作得很好。谢谢你的帮助。 – nfplee

1
var ex2 = JsonConvert.DeserializeObject("{\"Form\": {\"Id\": \"2\"}}", typeof(FormParameters)); 
+0

谢谢,但不幸的是我无法更改传入反序列化方法的字符串。我想知道是否有反序列化方法内的任何连接,就像使用asp.net mvc模型绑定一样,如果它试图绑定一个具有特定属性的属性,我将自定义绑定。 – nfplee