将JSON对象反序列化为用户定义的类型

piok6c0g  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个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\\\"}}]\""
thtygnil

thtygnil1#

你的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属性,如果希望具有不同的c#属性名,可以使用[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];

相关问题