2014-10-27 24 views
1

我想使用Json.NET將IAnimal實例對象序列化爲json。 類結構:Json.NET簡單的界面序列化

public class Dog : IAnimal { 
    public int Width { get; set; } 
    public double Bark { get; set; } 
} 

public class Cat : IAnimal { 
    public int Width { get; set; } 
    public double Meow { get; set; } 
} 

public interface IAnimal { 
    int Width { get; set; } 
} 

public class AnimalContainer { 
    public IAnimal Animal { get; set; } 
} 

試過這種方式(請注意我用「TypeNameHandling.Auto」正如我在其他線程中):

public void IAnimal_ShouldBeJsonSerializable() { 
     var animal = new AnimalContainer {Animal = new Dog {Bark = 5, Width = 2}}; 
     var json = JsonConvert.SerializeObject(animal, 
      new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.Auto}); 
     var deserializedAnimal = JsonConvert.DeserializeObject<AnimalContainer>(json); 
    } 

但扔我不同的是「無法創建類型IAnimal的實例,Type是一個接口或抽象類,不能實例化「。 但json包含具體的類型信息!

我該如何讓它工作?

+0

http://stackoverflow.com/questions/24644464/json-net-type-is-an-interface-or-abstract-class-and-cannot-be-instantiated – 2014-10-27 23:16:38

+1

你'Animals'有' Width' ??? – Shiva 2014-10-27 23:27:48

回答

2

看起來好像你正在將串行器設置傳遞給你的DeserializeObject調用。您需要在Serialize和Deserialize中包含TypeNameHandling

var animal = new AnimalContainer { Animal = new Dog { Bark = 5, Width = 2 } }; 
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
var json = JsonConvert.SerializeObject(animal, settings); 
var deserializedAnimal = JsonConvert.DeserializeObject<AnimalContainer>(json, settings); 
Console.WriteLine(deserializedAnimal.Animal.GetType().Name); 
+0

嘿,謝謝你的快速回復。它適用於動物是界面的情況。抽象類怎麼樣?再次獲取相同的異常。 – mbudnik 2014-10-27 23:35:32

+0

應該仍然有效;我只是通過創建一個抽象的'BaseAnimal'類並且使'Dog'和'Cat'從它繼承來嘗試它。 (我將'Width'屬性移動到底部。)然後我將'AnimalContainer'中的'Animal'屬性更改爲'BaseAnimal'。我運行了上面的序列化/反序列化代碼,並且它工作正常。 – 2014-10-27 23:45:31

+0

犯了一個錯字。它現在=] – mbudnik 2014-10-27 23:52:13