Я использую Json.NET для десериализации объекта, который включает вложенный словарь. Вот пример того, что я пытаюсь сделатьJson.net десериализованный вложенный словарь
public interface IInterface
{
String Name { get; set; }
}
public class AClass : IInterface
{
public string Name { get; set; }
}
public class Container
{
public Dictionary<IInterface, string> Map { get; set; }
public Container()
{
Map = new Dictionary<IInterface, string>();
}
}
public static void Main(string[] args)
{
var container = new Container();
container.Map.Add(new AClass()
{
Name = "Hello World"
}, "Hello Again");
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
PreserveReferencesHandling = PreserveReferencesHandling.All,
};
string jsonString = JsonConvert.SerializeObject(container, Formatting.Indented, settings);
var newContainer = JsonConvert.DeserializeObject<Container>(jsonString);
}
Я получил сообщение об исключении: не удалось преобразовать строку «ConsoleApplication1.AClass» в словарь ключей типа «ConsoleApplication1.IInterface». Создайте TypeConverter для преобразования из строки в объект типа ключа. Примите мои извинения, но я не могу найти способ де-сериализации интерфейса в словаре.
Большое спасибо заранее
спасибо. Предыдущий вопрос предлагает JsonArrayAttribute, однако он доступен только для класса, но как свойство. В любом случае, чтобы отметить свойство с помощью атрибута коллекции или словаря, пожалуйста. – duongthaiha
@duongthaiha вместо того, чтобы создавать свое свойство словарного типа, можете ли вы создать производный класс словаря с использованием объявления атрибута? – ChaseMedallion
Применяя атрибут 'JsonArray', требуется подкласс' Dictionary '. Один из вариантов заключается в преобразовании словаря в «List >», вызывая 'ToList()' в словаре и вместо этого сериализуя список. Затем, при десериализации, преобразуйте его обратно в словарь, используя 'ToDictionary (x => x.Key, x => x.Value)'. –