Проблема Newtonsoft. Json .JsonSerializationException при попытке десериализации с моделью - PullRequest
2 голосов
/ 23 февраля 2020

m пытается десериализовать файл Json, используя этот класс в качестве модели:

using CsQuery.StringScanner.Patterns;
using Lucene.Net.Support;
using System;
using System.Collections.Generic;
using System.Text;

namespace Test_Api
{
    public class Metric
    {
        public string __name__ { get; set; }
        public string instance { get; set; }
        public string job { get; set; }

    }
    public class Result
    {
        public Metric metric { get; set; }
        public IList<Lucene.Net.Support.Number> value { get; set; }

    }
    public class Data
    {
        public string resultType { get; set; }
        public IList<Result> result { get; set; }

    }
    public class Application
    {
        public string status { get; set; }
        public Data data { get; set; }

    }
}

мой Program.cs:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using QuickType;
namespace Test_Api
{
    class Program
    {
        static async System.Threading.Tasks.Task Main(string[] args)
        {
            List<Application> DataG = new List<Application>();
            using (var httpClient = new HttpClient())
            {
                using (var response = await httpClient.GetAsync("http://localhost:9090/api/v1/query?query=go_memstats_gc_cpu_fraction"))
                {
                    string apiResponse = await response.Content.ReadAsStringAsync();
                    DataG = JsonConvert.DeserializeObject<List<Application>>(apiResponse);
                }
            }
            Console.WriteLine(DataG);
        }

    }
}

Он продолжает выдавать мне эту ошибку :

Newtonsoft. Json .JsonSerializationException: 'Невозможно десериализовать текущий JSON объект (например, {"name": "value"}) в тип' System.Collections.Generi c .List`1 [Test_Api.Application] ', поскольку для корректной десериализации типу требуется массив JSON (например, [1,2,3]).

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

РЕДАКТИРОВАТЬ: Json Я хочу получить значения из:

{
    "status": "success",
    "data": {
        "resultType": "vector",
        "result": [
            {
                "metric": {
                    "__name__": "process_cpu_seconds_total",
                    "instance": "localhost:9090",
                    "job": "prometheus"
                },
                "value": [
                    1545222126.353,
                    "0.615464"
                ]
            }
        ]
    }
}

Ответы [ 2 ]

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

Вам нужно будет использовать

var result = JsonConvert.DeserializeObject<Application>(apiResponse);

Ваш Json возвращает один экземпляр Application, в то время как вы пытались десериализовать Json как List<Application> согласно коду в ОП. Это стало причиной ошибки.

0 голосов
/ 23 февраля 2020

Вам нужно сначала преобразовать свой ответ в массив

Application[] result = JsonConvert.DeserializeObject<Application[]>(apiResponse,
new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
});

, а затем вы можете создать список из массива, например

List<Application> DataG = new List<Application>();

for(int i = 0; i < result.Length; i++)
{
    DataG.Add(result[i]);
}

, теперь вы можете использовать свой список

...