Десериализовать Json строку с идентификатором переменной - PullRequest
0 голосов
/ 05 августа 2020

Я мало знаю о JSON, но у меня есть эта строка:

{
   "status":"ok",
   "meta":{
      "count":1
   },
   "data":{
      "504969624":{
         "statistics":{
            "all":{
               "wins":1921
            }
         }
      }
   }
}

Я хочу использовать ее в C#, но я не знаю, как построить класс с номером в Это. (Это идентификатор, поэтому он меняется). Он работает, когда я жестко кодирую его и пишу как "publi c class _504969624", но тогда он не будет работать с другими идентификаторами. Есть идеи?

1 Ответ

1 голос
/ 05 августа 2020

Добавление в данные более одного ключа в data:

{
    "status": "ok",
    "meta": {
        "count": 1
    },
    "data": {
        "504969624": {
            "statistics": {
                "all": {
                    "wins": 1921
                }
            }
        },
        "504969625": {
            "statistics": {
                "all": {
                    "wins": 42
                }
            }
        }
    }
}

Это помогает приложению QuickType создавать структуру класса C#, которая выглядит следующим образом:

// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using QuickType;
//
//    var stats = Stats.FromJson(jsonString);

namespace QuickType
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Stats
    {
        [JsonProperty("status")]
        public string Status { get; set; }

        [JsonProperty("meta")]
        public Meta Meta { get; set; }

        [JsonProperty("data")]
        public Dictionary<string, Datum> Data { get; set; }
    }

    public partial class Datum
    {
        [JsonProperty("statistics")]
        public Statistics Statistics { get; set; }
    }

    public partial class Statistics
    {
        [JsonProperty("all")]
        public All All { get; set; }
    }

    public partial class All
    {
        [JsonProperty("wins")]
        public long Wins { get; set; }
    }

    public partial class Meta
    {
        [JsonProperty("count")]
        public long Count { get; set; }
    }

    public partial class Stats
    {
        public static Stats FromJson(string json) => JsonConvert.DeserializeObject<Stats>(json, QuickType.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Stats self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...