У меня есть объект 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.Net или System.Text.Json или что-то другое?
@Camadas, спасибо, что указали на это. Я исправил, но проблема осталась.
@PeterCsala, я использую Newtonsoft Json
Ваш 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];
Спасибо, я пробовал, но все равно не работает.
Для меня это говорит об ошибке в позиции 513, я обновил точную строку в вопросе. пожалуйста, обратитесь к этому.
Привет, это помогло, проблема заключалась в многократной сериализации, поэтому вместо сериализации в строку я сохранил тип Dictionary<string,object>, благодаря чему я успешно смог десериализовать объект до ожидаемого типа.
В json у вас есть Option__r, но имя свойства MyProperty У вас есть правильное имя свойства либо в json, либо в классе