«object» не содержит определения для «DeserializeObject» и никакого метода расширения «DeserializeObject», принимающего первый аргумент типа «object» [duplicate]

Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...

Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена ​​для вас, поэтому простым языком ваш результат undefined на первом этапе, поэтому вы получили result = undefined до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...

Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?

Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.

Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:

$(document).ready(function(){
    function foo() {
        $.ajax({url: "api/data", success: function(data){
            fooDone(data); //after we have data, we pass it to fooDone
        }});
    };

    function fooDone(data) {
        console.log(data); //fooDone has the data and console.log it
    };

    foo(); //call happens here
});

Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.

14
задан InferOn 31 July 2014 в 07:40
поделиться

3 ответа

Ваша проблема двоякая:

  1. У вас нет класса, определенного на корневом уровне. Структура класса должна соответствовать целому JSON, вы не можете просто десериализовать из середины.
  2. Всякий раз, когда у вас есть объект, ключи которого могут измениться, вам нужно использовать Dictionary<string, T>. Обычный класс не будет работать для этого;

Сделайте ваши классы такими:

class RootObject
{
    [JsonProperty("results")]
    public Results Results { get; set; }
}

class Results
{
    [JsonProperty("jobcodes")]
    public Dictionary<string, JobCode> JobCodes { get; set; }
}

class JobCode
{
    [JsonProperty("_status_code")]
    public string StatusCode { get; set; }
    [JsonProperty("_status_message")]
    public string StatusMessage { get; set; }
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
}

Затем выполните десериализацию следующим образом:

RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);

Рабочая демонстрация здесь

33
ответ дан Brian Rogers 5 September 2018 в 09:37
поделиться

Поскольку вы не можете изменить схему JSON, и вы не можете установить постоянное количество свойств, я предлагаю вам использовать JObject

var jobject = JObject.Parse(json);

var results = jobject["results"];
var jobcodes = results["jobcodes"];

var output = jobcodes.Children<JProperty>()
                     .Select(prop => prop.Value.ToObject<JobCode>())
                     .ToList();

Внимание: код предполагает , что JSON всегда в правильной схеме. Вы также должны обрабатывать недопустимую схему (например, если свойство не относится к схеме JobCode).

1
ответ дан Loofer 5 September 2018 в 09:37
поделиться

Отличные ответы!

Для тех, кому может понадобиться дополнительная помощь в настройке класса JSON, попробуйте: http://json2csharp.com/#

Отличный способ автоматического создания классов!

Или еще проще, в VS, Goto:

Редактировать -> Специальная вставка -> Вставить как классы JSON

3
ответ дан Rusty Nail 5 September 2018 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: