C#Json.NET Camel Case复杂对象

问题描述 投票:0回答:1

我正在尝试将一个对象序列化为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库。

是否有一种干净的方法来获取我想要的东西?

c# json serialization json.net .net-4.0
1个回答
0
投票

首先,我注意到您的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"
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.