Получение ошибки при попытке проанализировать ответ JSON - не удается преобразовать объект типа «System.String» в тип «».

Получение ошибки при попытке проанализировать ответ JSON

try
{
   var result = (new JavaScriptSerializer()).Deserialize<Rootobject>(jsonResponse);
}
catch(Exception ex){}

Строка JSON

"[{\"ID\":1,\"Code\":null,\"Name\":\"Black\"},{\"ID\":1,\"Code\":null,\"Name\":\"Red\"},{\"ID\":1,\"Code\":\"blx\",\"Name\":\"Blue\"}]"

Скриншот прикреплен для подробной информации об ошибке и точной строки JSON.

введите здесь описание изображения

Я генерирую JSON со следующим кодом

   public string JSONTest()
   {
        List<Color> colors = new List<Color>(); 
        colors.Add(new Color() { ID = 1, Name = "Black" }); 
        colors.Add(new Color() { ID = 1, Name = "Red" }); 
        colors.Add(new Color() { ID = 1, Name = "Blue", Code = "blx" }); 

        return JsonConvert.SerializeObject(colors); 
    }

person Alex    schedule 20.02.2018    source источник
comment
Я также пробовал Class1 вместо RootObject, но та же ошибка. (Вы можете видеть классы Class1 и RootObject на прикрепленном снимке экрана.) Строка JSON действительна, как я проверил в jsonlint.com.   -  person Alex    schedule 20.02.2018
comment
Ваш json был закодирован дважды.   -  person tkausl    schedule 20.02.2018
comment
Вам нужно изменить строку json как { Property1 : [ ] }   -  person Baskar Rao    schedule 20.02.2018
comment
Показанный вами json может быть сериализован в IEnumerable<Class1> (не в Rootobject)   -  person    schedule 20.02.2018
comment
@StephenMuecke - {Невозможно преобразовать объект типа «System.String» в тип «System.Collections.Generic.IEnumerable`1[Class1]»}   -  person Alex    schedule 20.02.2018
comment
@tkausl - Почему json кодируется дважды? Я добавил код генерации json в свой вопрос   -  person Alex    schedule 20.02.2018
comment
Вы не можете получить эту ошибку на основе кода и json, которые вы показали.   -  person    schedule 20.02.2018
comment
@StephenMuecke — использование этого кода для получения JSON, закодированного дважды. Как это исправить - используя (WebClient client = new WebClient()) { string jsonResponse = client.DownloadString(colorUrl); }   -  person Alex    schedule 20.02.2018
comment
Можете ли вы решить проблему в методе, который вы вызываете (или у вас нет никакого контроля над этим?)   -  person    schedule 20.02.2018


Ответы (3)


Попробуй это

var result = (new JavaScriptSerializer()).Deserialize<List<Class1>>(jsonResponse);

вашим результатом будет список Class1

введите здесь описание изображения

person seven21    schedule 20.02.2018
comment
{Невозможно преобразовать объект типа "System.String" в тип "System.Collections.Generic.List`1[Class1]"} - person Alex; 20.02.2018
comment
Я попробовал код в LinqPad, и он смог десериализовать строку json. - person seven21; 20.02.2018
comment
Получение ошибки с вашим кодом. Я предполагаю, что проблема связана с моей строкой json. Кодируется дважды, я думаю. - person Alex; 20.02.2018
comment
Да, ваше изображение показывает двойную закодированную строку. Вам нужно проверить, что вызывает это между вашей функцией генерации json и вашей функцией парсера. - person seven21; 20.02.2018
comment
используя (клиент WebClient = новый WebClient()) { string jsonResponse = client.DownloadString (colorUrl); JSONParseTest(jsonResponse); } - person Alex; 20.02.2018

Эй, попробуйте использовать ниже:

 Class1 obj=new Class1();
 obj=serializer.Deserialize<Class1>(jsonResponse);
person Bhawna Jain    schedule 20.02.2018

JSON string для завершения процесса десериализации требуется корневой ключ.

В вашем случае этот JSON не знает, какой объект десериализовать

Вы должны показать, чтобы десериализовать класс в строке JSON.

 public class Rootobject
 {         
    public Class1[] Property1 { get; set; }
 }


 public class Class1
 {
    public int ID { get; set; }

    public string Code { get; set; }

    public string Name { get; set; }
 }



     string jsonResponse = "{ \"Property1\" :  [{\"ID\":1,\"Code\":null,\"Name\":\"Black\"},{\"ID\":1,\"Code\":null,\"Name\":\"Red\"},{\"ID\":1,\"Code\":\"blx\",\"Name\":\"Blue\"}] }";

     var result = (new JavaScriptSerializer()).Deserialize<Rootobject>(jsonResponse);

Создать строку JSON с корневым ключом

    public string JSONTest()
    {

        List<Class1> colors = new List<Class1>();
        colors.Add(new Class1() { ID = 1, Name = "Black" });
        colors.Add(new Class1() { ID = 1, Name = "Red" });
        colors.Add(new Class1() { ID = 1, Name = "Blue", Code = "blx" });

        return JsonConvert.SerializeObject(new Rootobject { Property1 = colors.ToArray() });
    }

В качестве альтернативы,

Метод DeserializeObject можно десериализовать напрямую в object. если вы используете его таким образом, вам не понадобится корневой ключ, но возвращаемое значение будет объектом..

 string jsonResponse = "[{\"ID\":1,\"Code\":null,\"Name\":\"Black\"},{\"ID\":1,\"Code\":null,\"Name\":\"Red\"},{\"ID\":1,\"Code\":\"blx\",\"Name\":\"Blue\"}]";
                object[] result = (object[])(new JavaScriptSerializer()).DeserializeObject(jsonResponse);
person Hüseyin Burak Karadag    schedule 20.02.2018
comment
Ваш код работает нормально. Как я могу добавить Property1 в строку JSON. Не просит добавить в строку json. Спрашивая, откуда генерируется json (вы можете увидеть код генерации строки JSON в конце вопроса выше). - person Alex; 20.02.2018
comment
@Alex Я обновил ответ, добавил Генерировать строку JSON с корневым ключом - person Hüseyin Burak Karadag; 21.02.2018