DataContractSerializer возвращает null для всех переменных, когда я пытаюсь десериализовать

#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. После этого все работало отлично.