Невозможно десериализовать ответ JSON в C # - PullRequest
0 голосов
/ 08 мая 2018

, поэтому я сейчас пытаюсь десериализовать JSON API. Я использую тот же код, который я успешно использовал для других API. Но каждая переменная просто возвращает 0.

    public class RootObject
{
    public int lat { get; set; }
    public int lon { get; set; }
    public DateTime date_iso { get; set; }
    public int date { get; set; }
    public double value { get; set; }
}

public class UVGetter
{
    public static async Task<RootObject> UVApiProxy(double lat, double lon)
    {
        var Timestamp = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();

        var http = new HttpClient();
        string WeatherApiKey = "secret";
        var url = String.Format($"https://api.openweathermap.org/data/2.5/uvi/history?appid=" + WeatherApiKey + "&lat=" + Math.Round(lat) + "&lon=" + Math.Round(lon) + "&start=" + Timestamp + "&end=" + Timestamp);
        var response = await http.GetAsync(url);
        var result = await response.Content.ReadAsStringAsync();
        var serializer = new DataContractJsonSerializer(typeof(RootObject));

        var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
        var uvdata = (RootObject)serializer.ReadObject(ms);
        Agara.Program.WeatherApiCalls++;
        Console.WriteLine(uvdata.lat + "\n" + uvdata.lon + "\n" + uvdata.date_iso.ToString() + "\n" + uvdata.date + "\n" + uvdata.value);
        return uvdata;
    }
}

Результат выглядит так

[{"lat":54,"lon":9,"date_iso":"2018-05-08T12:00:00Z","date":1525780800,"value":5.62}]

А переменные (например, uvdata.lat) просто содержат нули, хотя информация об API должна храниться в них.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Ваша строка json является массивом, а не отдельным объектом, поэтому вы должны десериализовать в массив. Для этого вы также можете использовать Newtonsoft.Json (хотя он прост в использовании), вы можете легко создать class, просто скопировав строку json и внутри VisualStudio

Редактировать -> PasteSpecial -> Вставить JSON как классы

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public int lat { get; set; }
    public int lon { get; set; }
    public DateTime date_iso { get; set; }
    public int date { get; set; }
    public float value { get; set; }
}

string json  = @"[{""lat"":54,""lon"":9,""date_iso"":""2018 - 05 - 08T12: 00:00Z"",""date"":1525780800,""value"":5.62}]";
Class1[] result = JsonConvert.DeserializeObject<Class1[]>(json);
0 голосов
/ 08 мая 2018

JSON не содержит RootObject, это массив из RootObject. Итак:

var serializer = new DataContractJsonSerializer(typeof(RootObject[]))
// ...
var uvdata = (RootObject[])serializer.ReadObject(ms);

В качестве альтернативы можно использовать Newtonsoft.Json :

var uvData = JsonConvert.DeserializeObject<RootObject[]>(result);

Вы также можете десериализовать в List<RootObject> вместо массива.

Если вы хотите сохранить начальные нули, десериализуйте эти свойства как строки, поскольку целые числа не имеют такой концепции, поэтому:

public class RootObject
{
    public string lat { get; set; }
    public string lon { get; set; }
    public DateTime date_iso { get; set; }
    public int date { get; set; }
    public double value { get; set; }
}
...