Я работаю над проектом C# .dotNet, который вызывает стороннюю службу REST.Использование DataContractJsonSerializer, десериализация строки JSON в объект C#, который имеет список и интерфейс как свойства
Пример Структура Класс:
[Serializable]
[DataContract(Name = "MainClass")]
[KnownType(typeof(Class1))]
[KnownType(typeof(Class2))]
public class MainClass : IMainInterface
{
public MainClass()
{
Value2 = new List<IClass2>();
}
[DataMember(Name = "class")]
public IClass1 Value1 { get; set; }
[DataMember(Name = "classes")]
public List<IClass2> Value2 { get; set; }
}
[Serializable]
[Export(typeof(IClass1))]
[ExportMetadata("IClass1", "Class1")]
[DataContract(Name = "class1")]
public class Class1 : IClass1
{
[ImportingConstructor]
public Class1()
{
}
[DataMember(Name = "prop1")]
public string Prop1 { get; set; }
[DataMember(Name = "prop2")]
public string Prop2 { get; set; }
[DataMember(Name = "prop3")]
public string Prop3 { get; set; }
}
[Serializable]
[Export(typeof(IClass2))]
[ExportMetadata("IClass2", "Class2")]
[DataContract]
public class Class2 : IClass2
{
[ImportingConstructor]
public Class2()
{ }
[DataMember(Name = "propA")]
public string PropA { get; set; }
[DataMember(Name = "propB")]
public string PropB { get; set; }
[DataMember(Name = "propC")]
public string PropC { get; set; }
}
public interface IMainInterface
{
IClass1 Value1 { get; set; }
List<IClass2> Value2 { get; set; }
}
public interface IClass1
{
string Prop1 { get; set; }
string Prop2 { get; set; }
string Prop3 { get; set; }
}
public interface IClass2
{
string PropA { get; set; }
string PropB { get; set; }
string PropC { get; set; }
}
Json_String1: (с типом намеком)
{
"class":
{"__type":"class1:#WpfApplication1","prop1":"TestVal0","prop2":"TestVal2","prop3":"TestVal3"},
"classes":
[
{"__type":"Class2:#WpfApplication1","propA":"A","propB":"B","propC":"C"},
{"__type":"Class2:#WpfApplication1","propA":"X","propB":"Y","propC":"Z"},
{"__type":"Class2:#WpfApplication1","propA":"1","propB":"2","propC":"3"}
]
}
Json_String2: (без типа намек)
{
"class":
{"prop1":"TestVal0","prop2":"TestVal2","prop3":"TestVal3"},
"classes":
[
{"propA":"A","propB":"B","propC":"C"},
{"propA":"X","propB":"Y","propC":"Z"},
{"propA":"1","propB":"2","propC":"3"}
]
}
Так, данный клас если я создаю json (объекта MainClass
), используя DataContractJsonSerializer
, я получаю Json_String1, и если я непосредственно десериализую, он отлично работает.
В то время, как в то время как GET данные Ting, ответ Json_String2 (без намека типа). Следовательно, при десериализации я получаю следующую ошибку.
InvalidCastException был необработанным. Невозможно передать объект типа 'System.Object', чтобы ввести 'WpfApplication1.IClass2'.
Теперь я должен вручную модифицировать json (string manipulation), добавив подсказку типа, чтобы десериализовать его успешно.
Вопрос 1) Как я могу избежать использования Json String Manipulation для десериализации?
Вопрос 2) как я могу создать json без подсказки типа?
редактировать: 1. Добавлен IMainInterface который реализуется MainClass. 2. dotNet Framework 4
Как вы называете ParseResponse в этом случае? Вы не можете назвать это ParseResponse()? –
Icepickle
@Icepickle 'ParseResponse (jsonResponse);', где jsonResponse - ответ от вызова GET Api. Структура Json определена, поэтому анализ класса 2 не даст желаемого результата. –
Bhramar
Тогда в вашем MainClass вы можете сделать «Список' '' '' no? как базовый класс? я имею в виду, каким-то образом он должен создавать экземпляры переменных во время десериализации и интерфейс, который вы не можете создать. –
Icepickle