#c# #serialization #json-deserialization #datacontractserializer
#c# #сериализация #json-десериализация #datacontractserializer
Вопрос:
У меня проблема, когда DataContractSerializer возвращает null для всех моих переменных. Как будто он их не видит или что-то в этом роде. Я использую его для десериализации файла json в объект. У меня это работало для другого файла json, который использовал другой класс с 3 строковыми атрибутами. Этот состоит из 40 атрибутов, в основном string и нескольких bool. Я работал над этим в течение нескольких часов, и я просто не могу понять, что я делаю неправильно. Я даже попробовал это только с 1 строковым атрибутом, и он все равно вернул null. Вот упрощенная версия, содержащая только 1 строковый атрибут и 1 атрибут bool. Любой совет более чем приветствуется.
Спасибо
Json : [{"Proposal_x0020_Type":"Lite Proposal","BI_x0020_Criteria_x0020_1":true}]
Функция, которая пытается десериализовать строку:
public Proposal[] Deserializer(string jsonFile)
{
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonFile));
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Proposal[]));
Proposal[] projectArr = (Proposal[])deserializer.ReadObject(ms);
Console.WriteLine(jsonFile);
Console.ReadLine();
return projectArr;
}
Класс объекта, который должен создать десериализатор:
PMIS пространства имен
{
[DataContract]
public class Proposal
{
[DataMember(Order = 0)]
public string Proposal_x0020_Type { get; set; }
[DataMember(Order = 1)]
public bool BI_x0020_Criteria_x0020_1 { get; set; }
}
}
Комментарии:
1. С помощью
DataContractJsonSerializer
этого json можно десериализоватьDictionary<string, object>[]
. В противном случае вы можете использовать какой-нибудь другой сериализатор. Например, json.net .
Ответ №1:
Мне удалось найти проблему, сравнив код этой десериализации с предыдущим, который у меня был. Единственным отличием было имя переменных внутри файла Json. Тот факт, что они содержат Юникод для пробела (x00200), вызывает некоторую проблему внутри DataContractDeserializer. Я полагаю, что он видит это как пробел, поэтому вместо того, чтобы видеть «Proposal_x0020_Type», он видит «Proposal_ _Type», но я не уверен в этом. В любом случае, решение состояло в том, чтобы удалить x0020 из всех переменных внутри файла Json. После этого все работало отлично.