Преобразование JSON в DataTable возвращает пустой результат в c# - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь преобразовать мои json данные в таблицу данных. Следовал всем подходам из этого поста , а также всем предлагаемым ссылкам по всему стеку, пытался многими способами, но все еще безрезультатно.

Мой метод выглядит так:

    public static async Task GetManagements()
    {
        Console.WriteLine("Getting managements");

        using var client = new HttpClient();

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", 
        await Token.GetToken());

        HttpResponseMessage response = await client.GetAsync(LibvirtUrls.managementUrl);
        HttpContent content = response.Content;

        Console.WriteLine("Response Status Code: " + (int)response.StatusCode);
        string result = await content.ReadAsStringAsync();
        var json = Helpers.FormatJson(result);
        Console.WriteLine("json");
        Console.WriteLine(result); // for testing
        Console.WriteLine(new string('-',35));
        Console.WriteLine("formatted");
        Console.WriteLine(json); // for testing
        // I used both result and json (formatted and not formatted one)
        Console.WriteLine(new string('-',35));
        List<NetworkDto> networkList = 
        JsonConvert.DeserializeObject<List<NetworkDto>>(json);
        Console.WriteLine("table view");
        var ss = networkList.ToDataTable<NetworkDto>();
        Console.WriteLine(ss);
    }

Пример json - после выполнения метода:

Getting managements as json
Response Status Code: 200
json
[{"id":1,"netMask":22,"gateway":"10.19.0.1","jenkinsUrl":"http://10.19.0.20:31000","bridge":"br0","ipRange":"10.19.0.1-10.19.3.254"},{"id":11,"netMask":22,"gateway":"10.23.0.1","jenkinsUrl":"http://10.12.3.12:33355","bridge":"br2","ipRange":"10.23.0.4-10.23.0.20"}]
------------------------------------------
formatted
[
    {
        "id":1,
        "netMask":22,
        "gateway":"10.19.0.1",
        "jenkinsUrl":"http://10.19.0.20:31000",
        "bridge":"br0",
        "ipRange":"10.19.0.1-10.19.3.254"
    },
    {
        "id":11,
        "netMask":22,
        "gateway":"10.23.0.1",
        "jenkinsUrl":"http://10.12.3.12:33355",
        "bridge":"br2",
        "ipRange":"10.23.0.4-10.23.0.20"
    }
]
------------------------------------------------
table view

Пробовал также с классом:

    public class NetworkDto
    {
        public int Id { get; set; }
        public int NetMask { get; set; }
        public string Gateway { get; set; }
        public string JenkinsUrl { get; set; }
        public string Bridge { get; set; }
        public string IpRange { get; set; }
    }

Метод расширения, который я использую для преобразования json в таблицу данных:

    public static DataTable ToDataTable<T>(this IList<T> data)
    {
        PropertyDescriptorCollection props =
            TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        for(int i = 0 ; i < props.Count ; i++)
        {
            PropertyDescriptor prop = props[i];
            table.Columns.Add(prop.Name, prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = props[i].GetValue(item);
            }
            table.Rows.Add(values);
        }
        return table;        
    }

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Десериализация из JSON в список пользовательских объектов тривиальна:

List<NetworkDto> networkList = JsonConvert.DeserializeObject<List<NetworkDto>>(json);

И это все! Теперь ваша переменная networkList представляет собой список объектов NetworkDto. Вы можете записать их все на консоль, если хотите убедиться, что они там:

foreach(var network in networkList)
(
    Console.WriteLine($"Network Id {network.Id}");
)
1 голос
/ 27 февраля 2020

Я проверил ваш код:

        static void Main() {
        string json = "[{\"id\":1,\"netMask\":22,\"gateway\":\"10.19.0.1\",\"jenkinsUrl\":\"http://10.19.0.20:31000\",\"bridge\":\"br0\",\"ipRange\":\"10.19.0.1-10.19.3.254\"},{\"id\":11,\"netMask\":22,\"gateway\":\"10.23.0.1\",\"jenkinsUrl\":\"http://10.12.3.12:33355\",\"bridge\":\"br2\",\"ipRange\":\"10.23.0.4-10.23.0.20\"}]";

        System.Data.DataTable dt = (System.Data.DataTable)JsonConvert.DeserializeObject(json, (typeof(System.Data.DataTable)));
        Console.WriteLine(dt);

        for (int i = 0; i < dt.Columns.Count; i++) {
            Console.Write(dt.Columns[i] + " | ");
        }
        Console.WriteLine();
        for (int j = 0; j < dt.Rows.Count; j++) {

            for (int i = 0; i < dt.Columns.Count; i++) {
                Console.Write(dt.Rows[j].ItemArray[i] + " | ");
            }
            Console.WriteLine();

        }
    }

Вывод:

id | сетевая маска | шлюз | jenkinsUrl | мост | ipRange |

1 | 22 | 10.19.0.1 | http://10.19.0.20: 31000 | br0 | 10.19.0.1-10.19.3.254 |

11 | 22 | 10.23.0.1 | http://10.12.3.12: 33355 | br2 | 10.23.0.4-10.23.0.20 |

Кажется, что таблица данных заполнена

...