从JSON中的metavalues对象中选择特定的可选键并存储到我的类中

时间:2017-11-14 16:12:33

标签: c# json json.net

我努力让这种转变发生,并且不确定它是否完全可行。来自第三方的我的JSON可能如下所示:

{
"equipments": [
    {
        "serialNumber": "11-17-053",
        "equipmentType_id": "589dda4952172110008870c7",
        "created": 1508856453875,
        "fieldOffice_id": "594af5425fbfca00111a0c20",
        "clients_id": [],
        "notes": "",
        "isInService": true,
        "metavalues": {
            "0t78nzhp9w265avlvt": {
                "item_ids": [
                    33121
                ]
            },
            "7ogz4kehqh8h3cwip8": {
                "item_ids": [
                    33128
                ]
            }
        },
        "schedules": [],
        "id": "59ef52854d40a9009c787596"
    },
    {
        "serialNumber": "11-17-054",
        "equipmentType_id": "589dda4952172110008870c7",
        "created": 1508856453875,
        "fieldOffice_id": "594af5425fbfca00111a0c20",
        "clients_id": [],
        "notes": "",
        "isInService": true,
        "metavalues": {
            "0t78nzhp9w265avlvt": {
                "item_ids": [
                    33121
                ]
            },
            "7ogz4kehqh8h3cwip8": {
                "item_ids": [
                    33128
                ]
            }
        },
        "schedules": [],
        "id": "59ef52854d40a9009c787597"
    },
    {
        "serialNumber": "8-17-022",
        "equipmentType_id": "589dda4952172110008870c7",
        "created": 1505326964589,
        "fieldOffice_id": "594af5425fbfca00111a0c20",
        "clients_id": [],
        "notes": "",
        "isInService": true,
        "metavalues": {
            "0t78nzhp9w265avlvt": {
                "item_ids": [
                    33121
                ]
            },
            "7ogz4kehqh8h3cwip8": {
                "item_ids": [
                    33128
                ]
            }
        },
        "schedules": [],
        "id": "59b9777480e426009d01d48d"
    },
    {
        "serialNumber": "22A-17-001",
        "equipmentType_id": "589dda4952172110008870c7",
        "created": 1504908025733,
        "fieldOffice_id": "58b74b080c206710004ff726",
        "clients_id": [
            "59bbfdf5725cd00012fb15d8"
        ],
        "notes": "",
        "isInService": true,
        "metavalues": {
            "0t78nzhp9w265avlvt": {
                "item_ids": [
                    33122
                ]
            },
            "7ogz4kehqh8h3cwip8": {
                "item_ids": [
                    33128
                ]
            },
            "g99idmcqyuo2na9e6l": "YARD",
            "709pm94prt2tpjt90y": 5,
            "bgen1h4i5b6f8xa1kh": "9/8/2017 7:18:24 PM",
            "yvtvsl8dedudqjtdud": "0.00000, 0.00000",
            "aj3h2b5fdbic9s72m3": "Parex",
            "8wt1re82xidjiv8rzi": "YARD"
        },
        "schedules": [],
        "id": "59b312f93256d5009c4a73fb"
    },....

这显然不是一个完整的例子,但应该有助于解决我的问题。

有没有办法创建一个C#类,只有当它们存在于" metavalues"阵列

我目前的课程如下,它可以获取数据,但不完全是我想要的。

public class Equipment
{
    [JsonProperty("serialNumber")]
    public string SerialNumber { get; set; }
    public string equipmentType_id { get; set; }
    public bool isInService { get; set; }
    public List<string> clients_Id { get; set; }
    public string fieldOffice_id { get; set; }
    [JsonProperty("id")]
    public string EquipmentId { get; set; }
    [JsonProperty("metavalues")]
    public Dictionary<string, object> metavalues { get; set; } 
}

我所追求的是&#34; g99idmcqyuo2na9e6l&#34;这在metavalues中是可选的,并将其存储在名为&#34; LeaseName&#34;的属性中。

我尝试了以下无济于事。

    public class Equipment
    {
        [JsonProperty("serialNumber")]
        public string SerialNumber { get; set; }
        public string equipmentType_id { get; set; }
        public bool isInService { get; set; }
        public List<string> clients_Id { get; set; }
        public string fieldOffice_id { get; set; }
        [JsonProperty("id")]
        public string EquipmentId { get; set; }
        [JsonProperty("g99idmcqyuo2na9e6l")]
        public string LeaseName { get; set; }
    }

如果我尝试为metavalues部分创建一个类,我会得到一个异常,表明JSON.NET无法将其转换为我的对象,因此我使用了Dictionary<string, object>选项。

编辑#1:接受的答案对我有用,但是对于那些偶然发现并确实需要嵌套数组中的属性名称的人,您可以尝试以下方法。

[OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            if (metavalues != null)
            {
                if (metavalues.ContainsKey("g99idmcqyuo2na9e6l"))
                {
                    string _LeaseName = (string)metavalues["g99idmcqyuo2na9e6l"];
                    LeaseName = _LeaseName;
                }
            }
        }

我认为我的编辑方法有点矫枉过正,但只是把它扔到那里。

1 个答案:

答案 0 :(得分:3)

是的,这是可能的,但由于租约值在JSON中仍然是一个级别,因此您需要一个中间类来保存它(以替换字典)。

public class Equipment
{
    ...
    [JsonProperty("metavalues")]
    public MetaValues MetaValues { get; set; }
}

public class MetaValues
{
    [JsonProperty("g99idmcqyuo2na9e6l")]
    public string LeaseName { get; set; }
}

小提琴:https://dotnetfiddle.net/Ddqzc7