【问题标题】:C# Json.NET Camel Case Complex ObjectC# Json.NET 骆驼案例复杂对象
【发布时间】:2020-01-31 20:54:26
【问题描述】:

我正在尝试将对象序列化为 camelCase,但我发现只有根级别的对象是正确的 camelCased。根级别以下的所有内容都以 PascalCase 的形式出现。我正在使用 Json.NET 12.0.3 和 .NET Framework 4.0 编写控制台应用程序。

public class Deal
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<PublicId> PublicIds { get; set; }
}
public class PublicId
{
    public string IdType { get; set; }
    public string Value { get; set; }
}

要序列化我正在使用:

var json = JsonConvert.SerializeObject(deal, Formatting.Indented, new JsonSerializerSettings
{
    DateFormatString = "yyyy-MM-dd",
    ContractResolver = new CamelCasePropertyNamesContractResolver()
});

结果 json 看起来像:

{
  "id": null,
  "name": "Deal 1",
  "publicIds": [
    {
      "IdType": "ID1",
      "Value": "A12"
    },
    {
      "IdType": "ID2",
      "Value": "B12"
    }
  ]
}

正如您所见,IdType 和 Value 的值在 camelCase 中没有正确序列化,而是在 PascalCase 中序列化。在某些情况下,我需要更改默认 PascalCase 和 camelCase 之间的序列化,因此我将无法在序列化期间使用 JsonProperty 注释来强制使用 camelCase。此外,我想坚持使用 Json.NET 作为我项目的唯一 json 库。

有没有一种干净的方法可以得到我正在寻找的东西?

【问题讨论】:

  • 你确定在任何地方都没有JsonProperty 属性吗?
  • 在 LinqPad 中运行它会生成所有属性都经过驼峰化处理的 json。缺少一些导致您的问题的信息。

标签: c# json serialization json.net .net-4.0


【解决方案1】:

首先我注意到你的Deal 类没有初始化PublicIds。在这种情况下,代码实际上应该抛出一个错误。

但是,您指定合约求解器CamelCasePropertyNamesContractResolver 的代码是正确的。

以下是一个控制台代码,似乎返回正确的JSON 值。

public class Deal
{
    public Deal()
    {
        PublicIds = new List<PublicId>();
    }

    public string Id { get; set; }
    public string Name { get; set; }
    public List<PublicId> PublicIds { get; set; }
}

public class PublicId
{
    public string IdType { get; set; }
    public string Value { get; set; }
}

然后在控制台中,如果尝试下面的代码似乎会产生所需的结果。

public static void Main()
{
    var deal = new Deal();
    deal.Name = "Deal 1";
    deal.PublicIds.Add(new PublicId { IdType = "ID1", Value = "A12" });
    deal.PublicIds.Add(new PublicId { IdType= "ID2", Value= "B12"});

    var json = JsonConvert.SerializeObject(deal, Formatting.Indented, new JsonSerializerSettings
    {
        DateFormatString = "yyyy-MM-dd",
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    });

    Console.WriteLine(json);
    Console.ReadLine();
}

代码输出:

{
  "id": null,
  "name": "Deal 1",
  "publicIds": [
    {
      "idType": "ID1",
      "value": "A12"
    },
    {
      "idType": "ID2",
      "value": "B12"
    }
  ]
}

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多