【问题标题】:Converting Complex JSON to C# Model将复杂 JSON 转换为 C# 模型
【发布时间】:2021-03-25 12:10:36
【问题描述】:

我正在尝试解析我收到的一些复杂 JSON 以将其转换为 C# 模型,以便我可以分析和操作数据。我曾尝试通过使用 JSON 将 JSON 转换为 C#,但是当名称是动态的时它不能很好地工作。我想专注于数据。

Item1 和 SubItem1 等都是可变字符串,所以我无法硬编码模型来拉取它们,而文本只是其中的一个字符串。我遇到的问题是如何将 JSON 转换为可用格式以访问 Item1、SubItem1 和文本值来操作它们的数据。

我已经按照其他地方的建议查看了字典,但我没有运气。

我尝试过的模型

public class Data
{
        public string Status { get; set; }
        public ResultInfo ResultInfo { get; set; }
        public string Message { get; set; }
        public Dictionary<string, SubData> Data {get;set;}
}

public class SubData
{
   public Dictionary<string,List<string>> item {get;set;}
}

JSON

{
    "Status": "OK",
    "ResultInfo": {
        "Prev": "PageUPURL",
        "Next": "PageDownURL",
        "total_count": "37",
        "per_page": "3",
        "page": "1"
    },
    "Message": "Ok.",
    "Data": {
        "Item1": [
            {
                "SubItem1": [
                    "Text"
                ]
            }
        ],
        "Item2": [
            {
                "SubItem2": [
                    "Text",
                    "Text",
                    "Text"
                ]
            }
        ],
        "Item3": [
            {
                "SubItem3": [
                    "Text"
                ]
            },
            {
                "SubItem4": [
                    "Text"
                ]
            }
        ]
    }
}

我们将不胜感激地收到任何建议、建议或帮助。

【问题讨论】:

  • 我认为您只是错过了一级public Dictionary&lt;string, List&lt;Dictionary&lt;string, List&lt;string&gt;&gt;&gt;&gt; Data { get; set; },因为ItemX 后面跟着[,它是一个列表或数组。
  • 将您的数据更改为public Dictionary&lt;string, List&lt;SubData&gt;&gt; Data {get;set;}
  • 对于那些您可以使用app.quicktype.io 的人,只需将要强制字典的属性名称重命名为 "1","2" 。瞧。
  • 感谢您的帮助!我非常讨厌它,因为您错过了导致问题的一件小事!
  • 我认为我们都没有,请尝试我们的建议。因为我手头没有IDE。我们可能错了。所以先试试吧^^

标签: c# json json.net


【解决方案1】:

对于那些我使用https://app.quicktype.io 的任务。
因为当属性名称为数字时它可以轻松地重新识别字典,所以您只需稍微编辑一下您的 Json。
并将其粘贴到工具中。

{
    "Status": "OK",
    "ResultInfo": {
        "Prev": "PageUPURL",
        "Next": "PageDownURL",
        "total_count": "37",
        "per_page": "3",
        "page": "1"
    },
    "Message": "Ok.",
    "Data": {
        "1": [
            {
                "1": [
                    "Text"
                ]
            }
        ],
        "2": [
            {
                "1": [
                    "Text",
                    "Text",
                    "Text"
                ]
            }
        ],
        "3": [
            {
                "1": [
                    "Text"
                ]
            },
            {
                "2": [
                    "Text"
                ]
            }
        ]
    }
}

结果类是:

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

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

    [JsonProperty("Message")]
    public string Message { get; set; }

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

public partial class ResultInfo
{
    [JsonProperty("Prev")]
    public string Prev { get; set; }

    [JsonProperty("Next")]
    public string Next { get; set; }

    [JsonProperty("total_count")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long TotalCount { get; set; }

    [JsonProperty("per_page")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long PerPage { get; set; }

    [JsonProperty("page")]
    [JsonConverter(typeof(ParseStringConverter))]
    public long Page { get; set; }
}

在线演示https://dotnetfiddle.net/1j42kR


注意:该工具还包括一个从“字符串”到“长”的转换器,用于"per_page": "3",

【讨论】:

    【解决方案2】:

    更改下一行

    public Dictionary<string, SubData> Data {get;set;}
    

    作为

    public Dictionary<string, Dictionary<string, string[]>[]> Data { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多