Десериализовать JSON с $ в именах свойств - PullRequest
1 голос
/ 17 марта 2020

У меня есть следующий JSON объект (форма объекта будет меняться, следовательно, будет использоваться Dynami c):

{
    "mba$maccType": [{
        "class": {
            "id": 1057,
            "intlId": "cacc"
        },
        "classA": false,
        "endDate": "4712-12-31T00:00:00",
        "histStatus": {
            "id": 5,
            "intlId": "valid"
        },
        "objClassif": {
            "id": 74,
            "intlId": "mba$macc_type"
        },
        "secUser": {
            "id": 2
        },
        "startDate": "2018-12-01T00:00:00",
        "timestamp": "2020-01-18T07:29:21"
    }
]
}

Я использую Newtonsoft. Json для анализа следующим образом :

dynamic dyn = JObject.Parse(json);

Моя проблема в том, что я не могу ссылаться на какие-либо свойства динамического c, потому что родительское свойство, содержащее $, дает синтаксическую ошибку:

Console.WriteLine(dyn.mba$maccType);

Как я могу получить значение "class.intlId" (то есть "ca cc")?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Предполагая, что единственной динамической c частью вашей JSON структуры являются имена свойств внешнего объекта, вы можете десериализовать это JSON в Dictionary<string, List<T>>. Преимущество этого состоит в том, что у вас будут четко определенные типы практически для всего десериализованного.

// type definitions
class ClassRecord
{
    public int id { get; set; }
    public string intlId { get; set; }
}

class Item
{
    public ClassRecord @class { get; set; }
    public bool classA { get; set; }

    // etc.
}

// deserialize
var obj = JsonConvert.DeserializeObject<Dictionary<string, List<Item>>>(json);

Console.WriteLine(obj["mba$maccType"][0].@class.id); // 1057
1 голос
/ 17 марта 2020

Вы можете проанализировать ваш JSON до JObject вместо dynamic и получить доступ к его элементам по ключу. Как получить первый элемент из mba$maccType (так как это массив), затем получить доступ к токену class и значению intlId из него

var jObject = JObject.Parse(json);
var firstItem = jObject["mba$maccType"]?.FirstOrDefault();
var result = firstItem?["class"]?["intlId"]?.ToString(); // returns "cacc"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...