将 JSON 对象转换为 .NET 中的模型

Convert JSON object to Model in .NET

我从 API 返回了这个 JSON 对象:

[
  {
    "batchId": 789,
    "debtId": 1841,
    "dateAdded": "2021-07-27T16:01:39.41",
    "debtCategoryId": 2,
    "agreementNumber": 78262155,
    "clientNumber": 1068055,
    "clientName": "Client Two"
  },
  {
    "batchId": 866,
    "debtId": 1918,
    "dateAdded": "2021-08-25T14:47:18.13",
    "debtCategoryId": 2,
    "agreementNumber": 1000140792,
    "clientNumber": 11213287,
    "clientName": "Client One"
  }
]

我正在尝试将其转换为具有以下结构的 C# 对象:

public class DebtConfirmationResponse
    {
        public List<DebtConfirmation> DebtConfirmations { get; set; }
    }

DebtConfirmation 具有以下属性:

public class DebtConfirmation
    {
        public int BatchId { get; set; }
        public int DebtId { get; set; }
        public string DateAdded { get; set; }
        public int DebtCategoryId { get; set; }
        public string AgreementNumber { get; set; } = string.Empty;
        public string ClientNumber { get; set; } = string.Empty;
        public string ClientName { get; set; } = string.Empty;
    }

我得到的错误是:

the json value could not be converted to the name of the model path $ linenumber 0 bytepositioninline 1

模型的设置方式有什么问题吗? 我还尝试将批次 ID 转换为相同的模型,仅作为 属性,但我收到了相同的消息。

你在C#代码中定义了AgreementNumberClientNumber为字符串,但是在json中这个属性是数字,所以你必须将它定义为longs。

另一点是您不需要围绕 DebtConfirmation class 的包装器。将您的 json 解散为 ICollectionIList 或仅 ListDebtConfirmation 个对象。

我使用 quicktype.io 从您提供的 json 示例中检索 C# classes。这对于那些不想为他们的 JSON 字符串手动生成模型的人非常有帮助。

这是代码示例。

输出为:

789
866
using System.Text.Json;
using System.Text.Json.Serialization;

string json = "[\n  {\n    \"batchId\": 789,\n    \"debtId\": 1841,\n    \"dateAdded\": \"2021-07-27T16:01:39.41\",\n    \"debtCategoryId\": 2,\n    \"agreementNumber\": 78262155,\n    \"clientNumber\": 1068055,\n    \"clientName\": \"Client Two\"\n  },\n  {\n    \"batchId\": 866,\n    \"debtId\": 1918,\n    \"dateAdded\": \"2021-08-25T14:47:18.13\",\n    \"debtCategoryId\": 2,\n    \"agreementNumber\": 1000140792,\n    \"clientNumber\": 11213287,\n    \"clientName\": \"Client One\"\n  }\n]";
var data = JsonSerializer.Deserialize<ICollection<DebtConfirmation>>(json);
foreach (DebtConfirmation current in data)
{
    Console.WriteLine(current.BatchId);
}


public partial class DebtConfirmation 
{
    [JsonPropertyName("batchId")]
    public long BatchId { get; set; }

    [JsonPropertyName("debtId")]
    public long DebtId { get; set; }

    [JsonPropertyName("dateAdded")]
    public DateTimeOffset DateAdded { get; set; }

    [JsonPropertyName("debtCategoryId")]
    public long DebtCategoryId { get; set; }

    [JsonPropertyName("agreementNumber")]
    public long AgreementNumber { get; set; }

    [JsonPropertyName("clientNumber")]
    public long ClientNumber { get; set; }

    [JsonPropertyName("clientName")]
    public string ClientName { get; set; }
}

您可以使用@GeorgyTarasov 的回答。但这绝对不是最简单的选择。

您可以简单地使用 JsonNamingPolicy.CamelCase

那么你只需要做...

var options = new JsonSerializerOptions
{
    DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
};
var ret = JsonSerializer.Deserialize<DebtConfirmation>(payload, options);

如果您使用的是 AspNet Core,您可以在此处注册该选项

services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    });