Как десериализовать объект Json - C # - PullRequest
0 голосов
/ 10 октября 2018

Веб-служба возвращает объект JSON в виде ошибки:

JsonString = "{"d":"[{\"sname\":\"S1\",\"region\":\"R1\",\"name\":\"Q1\"},{\"sname\":\"S2\",\"region\":\"R2\",\"name\":\"Q2\"}]"}"

Я попытался десериализовать, выполнив следующее:

  1. Определите объекты

    public class RootResponseClass
    {
        public ResponseParametersClass[] d { get; set; }
    }
    
    public class ResponseParametersClass
    {
        public string sname { get; set; }
        public string region { get; set; }
        public string name { get; set; }
    }
    
  2. Записать метод десериализации

     JavaScriptSerializer ser2 = new JavaScriptSerializer();
    
     RootResponseClass obj = new RootResponseClass();
    
     obj = ser2.Deserialize<RootResponseClass>(JsonString);
    

Но это дает ошибку "Невозможно преобразовать объект типа 'System.String' в тип 'NAS.Helpers.ResponseParametersClass [] ", так как я могу это сделать!

Решение

 public class RootResponseClass
    {
        public string d { get; set; }
    }

И для десериализации метод:

JavaScriptSerializer ser2 = new JavaScriptSerializer();
RootResponseClass obj = new RootResponseClass();
obj = ser2.Deserialize<RootResponseClass>(JsonString);

List<ResponseParametersClass> obj2 = new List<ResponseParametersClass>();
obj2 = ser2.Deserialize<List<ResponseParametersClass>>(obj.d.ToString());

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Кажется, что ваша строка Json содержит другую строку Json.Таким образом, чтобы десериализовать это, вам нужно десериализовать, как вы делаете сейчас, но измените ResponseParametersClass на string.

Тогда вам нужно будет десериализовать только что полученную строку (как List<ResponseParametersClass>).Так что в этом случае вам нужно десериализовать в два отдельных шага.

0 голосов
/ 10 октября 2018

Вы можете использовать пакет using Newtonsoft.Json; для десериализации JSON

пример

JsonString = "{"d":"[{\"sname\":\"S1\",\"region\":\"R1\",\"name\":\"Q1\"},{\"sname\":\"S2\",\"region\":\"R2\",\"name\":\"Q2\"}]"}";

var foo = JsonConvert.DeserializeObject<RootResponseClass>(JsonString);

foo - ваш десериализованный объект.

EDIT

В качестве дополнительной информации, почему первоначальный способ не работает, потому что ваш массив начинается с кавычек, поэтому он распознается как строка.После "{"d": должно быть просто [] вместо "[]"

Спасибо Dnomyar96 за указание этого дополнительного.

...