Десериализовать красивый вывод json Активной кампании в объект c # - PullRequest
0 голосов
/ 22 января 2019

... и "красивый" здесь саркастичен.

Когда вы вызываете конечную точку list_view Active Campaign и хотите получить ее в ответе json, тогда вы получите ответ json:

{
    "0": {
        "id": "4",
        "name": "Nieuwsletter 1",
        "cdate": "2018-11-22 03:44:19",
        "private": "0",
        "userid": "6",
        "subscriber_count": 2901
    },
    "1": {
        "id": "5",
        "name": "Newsletter 2",
        "cdate": "2018-11-22 05:02:41",
        "private": "0",
        "userid": "6",
        "subscriber_count": 2229
    },
    "2": {
        "id": "6",
        "name": "Newsletter 3",
        "cdate": "2018-11-22 05:02:48",
        "private": "0",
        "userid": "6",
        "subscriber_count": 638
    },
    "result_code": 1,
    "result_message": "Success: Something is returned",
    "result_output": "json"
}

Теперь, как бы я смог десериализовать это для объекта? Выполнение обычного Edit => Paste Special => Paste JSON As Classes дает мне вывод, где я получаю классы с именем _2.

Кроме того, JsonConvert выдает следующую ошибку: Accessed JObject values with invalid key value: 2. Object property name expected. Так что на самом деле его также невозможно десериализовать. Я пытался использовать dynamic в качестве типа объекта для преобразования в.

Единственное, о чем я могу думать сейчас, это заменить первый { на [, а последний } на ], затем удалить все элементы "1" : и затем удалить последние 3 свойства. После этого у меня есть базовый массив, который легко конвертируется. Но я надеюсь, что у кого-то есть лучшее решение вместо того, чтобы углубляться в string.indexOf и string.Replace party ...

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Если ваша пара ключ / значение не является фиксированной и данные должны быть конфигурируемыми, то в Newtonsoft.json есть одна особенность, которая будет использоваться здесь, и это [JsonExtensionData]. Подробнее

Данные расширения теперь записываются при сериализации объекта.Чтение и запись данных расширения позволяет автоматически выполнять обход всех JSON без добавления каждого свойства к типу .NET, к которому вы десериализуетесь.Объявите только те свойства, которые вас интересуют, и пусть данные расширений сделают все остальное.

В вашем случае пара ключ / значение с 0,1,2,3.......N имеет динамические данные, поэтому ваш класс будет

Так что создайте одно свойство, которое собирает все ваши динамические пары ключ / значение с атрибутом [JsonExtensionData].И ниже я создаю тот с именем DynamicData.

class MainObj
{
    [JsonExtensionData]
    public Dictionary<string, JToken> DynamicData { get; set; }

    public int result_code { get; set; }
    public string result_message { get; set; }
    public string result_output { get; set; }
}

И затем вы можете десериализовать ваш JSON как

string json = "Your json here"

MainObj mainObj = JsonConvert.DeserializeObject<MainObj>(json); 

Редактировать:

Если вы хотите собрать значение вашего динамического ключа в классе, вы можете использовать ниже структуру класса.

class MainObj
{
    [JsonExtensionData]
    public Dictionary<string, JToken> DynamicData { get; set; }

    [JsonIgnore]
    public Dictionary<string, ChildObj> ParsedData
    {
        get
        {
            return DynamicData.ToDictionary(x => x.Key, y => y.Value.ToObject<ChildObj>());
        }
    }

    public int result_code { get; set; }
    public string result_message { get; set; }
    public string result_output { get; set; }
}

public class ChildObj
{
    public string id { get; set; }
    public string name { get; set; }
    public string cdate { get; set; }
    public string _private { get; set; }
    public string userid { get; set; }
    public int subscriber_count { get; set; }
}

И затем вы можете десериализовать ваш JSON как

MainObj mainObj = JsonConvert.DeserializeObject<MainObj>(json);

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

int result_code = mainObj.result_code;
string result_message = mainObj.result_message;
string result_output = mainObj.result_output;

foreach (var item in mainObj.ParsedData)
{
    string key = item.Key;
    ChildObj childObj = item.Value;

    string id = childObj.id;
    string name = childObj.name;
    string cdate = childObj.cdate;
    string _private = childObj._private;
    string userid = childObj.userid;
    int subscriber_count = childObj.subscriber_count;
}
0 голосов
/ 22 января 2019

Я бы рекомендовал JObject из библиотеки Newtonsoft.Json

например. используя C # интерактивный

// Assuming you've installed v10.0.1 of Newtonsoft.Json using a recent version of nuget
#r "c:\Users\MyAccount\.nuget\.nuget\packages\Newtonsoft.Json\10.0.1\lib\net45\Newtonsoft.Json.dll"

using Newtonsoft.Json.Linq;
var jobj = JObject.Parse(File.ReadAllText(@"c:\code\sample.json"));
foreach (var item in jobj)
{
     if (int.TryParse(item.Key, out int value))
     {
         Console.WriteLine((string)item.Value["id"]);

         // You could then convert the object to a strongly typed version
         var listItem = item.Value.ToObject<YourObject>();
      }
}

Какие выходы:

 4
 5
 6

См. Эту страницу для более подробной информации

https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

...