首页 > 解决方案 > 反序列化具有可变 ID 的 Json 字符串

问题描述

我对 JSON 不太了解,但我有这个字符串:

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

我想在 C# 中使用它,但我不知道如何使用其中的数字构建类。(它是一个 ID,所以它会改变)。当我对其进行硬编码并像这样“公共类_504969624”那样编写它时它可以工作,但是它不会与其他ID一起工作。有任何想法吗?

标签: c#jsonapi

解决方案


扩充数据以在 中具有多个键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 }
            },
        };
    }
}

推荐阅读