Десериализовать объект JSON в пользовательский тип

У меня есть объект JSON, который похож на

[
    {
        "attributes": {
            "type": "M2O_ProductOptions__c",
            "url": ""
        },
        "Id": "aAP8A0000004ZkiWAE",
        "ExternalId__c": "123456_ABCDEFG",
        "Product__r": {
            "attributes": {
                "type": "Product2",
                "url": "/services/data/v51.0/sobjects/Product2"
            },
            "ProductCode": "123456"
        },
        "Option__r": {
            "attributes": {
                "type": "Product2",
                "url": "/services/data/v51.0/sobjects/"
            },
            "ProductCode": "23456"
        }
    }
]

А у меня занятия

public class SF_M20_ProductOptions
{
    public string Id { get; set; }
    public string ExternalId__c { get; set; }
    public Product__r Product__r { get; set; }
    public Option__r Option__r { get; set; }
}

public class Product__r
{
    public string ProductCode { get; set; }
}

public class Option__r
{
    public string ProductCode { get; set; }
}

Я пытаюсь десериализовать строку JSON в тип SF_M20_ProductOptions, но получаю сообщение об ошибке.

Невозможно преобразовать строку типа в SF_M20_ProductOptions

Примечание: элемент "attributes":{} не является частью типа SF_M20_ProductOptions. Как-то мне нужно избежать этого во время десериализации.

Я так пытаюсь


List<SF_M20_ProductOptions> obj = JsonConvert.DeserializeObject<List<SF_M20_ProductOptions>>(doc);

Точное значение doc (doc.toString()) равно

"\"[{\\\"attributes\\\":{\\\"type\\\":\\\"M2O_ProductOptions__c\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/M2O_ProductOptions__c/aAP8A0000004ZkiWAE\\\"},\\\"Id\\\":\\\"aAP8A0000004ZkiWAE\\\",\\\"ExternalId__c\\\":\\\"722137_NCVB641\\\",\\\"Product__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000005vdmtQAA\\\"},\\\"ProductCode\\\":\\\"722137\\\"},\\\"Option__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000004f9FtQAI\\\"},\\\"ProductCode\\\":\\\"NCVB641\\\"}}]\""

В json у вас есть Option__r, но имя свойства MyProperty У вас есть правильное имя свойства либо в json, либо в классе

Camadas 22.02.2023 15:58

Вы используете Json.Net или System.Text.Json или что-то другое?

Peter Csala 22.02.2023 15:59

@Camadas, спасибо, что указали на это. Я исправил, но проблема осталась.

Bala 22.02.2023 16:36

@PeterCsala, я использую Newtonsoft Json

Bala 22.02.2023 16:36
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш json - это коллекция, поэтому вам нужно десеиализировать ее до коллекции

using Newtonsoft.Json;

SF_M20_ProductOptions options = JsonConvert
                      .DeserializeObject<List<SF_M20_ProductOptions>>(json)[0];

Или

using System.Text.Json;

SF_M20_ProductOptions options = System.Text.Json.JsonSerializer
                            .Deserialize<List<SF_M20_ProductOptions>>(json)[0];

И исправить свойство Option__r, вы можете использовать атрибут [JsonProperty], если хотите иметь другое имя свойства С#

public class SF_M20_ProductOptions
{
    public string Id { get; set; }
    public string ExternalId__c { get; set; }
    public Product__r Product__r { get; set; }
    
    [JsonProperty("Option__r")]  // using Newtonsoft.Json
    [JsonPropertyName("Option__r")] //using System.Text.Json
    public Option__r OptionR { get; set; }
}

Обновлять

Ваш второй json был дважды сериализован, лучше исправьте исходник, иначе

using Newtonsoft.Json;

var json2 = "\"[{\\\"attributes\\\":{\\\"type\\\":\\\"M2O_ProductOptions__c\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/M2O_ProductOptions__c/aAP8A0000004ZkiWAE\\\"},\\\"Id\\\":\\\"aAP8A0000004ZkiWAE\\\",\\\"ExternalId__c\\\":\\\"722137_NCVB641\\\",\\\"Product__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000005vdmtQAA\\\"},\\\"ProductCode\\\":\\\"722137\\\"},\\\"Option__r\\\":{\\\"attributes\\\":{\\\"type\\\":\\\"Product2\\\",\\\"url\\\":\\\"/services/data/v51.0/sobjects/Product2/01t8A000004f9FtQAI\\\"},\\\"ProductCode\\\":\\\"NCVB641\\\"}}]\"";
json2 = Regex.Unescape(json2);
json2 = json2.Substring(1,json2.Length-2);

SF_M20_ProductOptions options = JsonConvert
                      .DeserializeObject<List<SF_M20_ProductOptions>>(json2)[0];

Спасибо, я пробовал, но все равно не работает.

Bala 22.02.2023 17:36

Для меня это говорит об ошибке в позиции 513, я обновил точную строку в вопросе. пожалуйста, обратитесь к этому.

Bala 22.02.2023 17:46

Привет, это помогло, проблема заключалась в многократной сериализации, поэтому вместо сериализации в строку я сохранил тип Dictionary<string,object>, благодаря чему я успешно смог десериализовать объект до ожидаемого типа.

Bala 23.02.2023 12:23

Другие вопросы по теме