2013-11-22 66 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