Newtonsoft JSON 序列化为小驼峰大小写的问题

Issue with Newtonsoft JSON Serialization to Lower Camel Case

提问人:bilpor 提问时间:11/17/2023 最后编辑:dbcbilpor 更新时间:11/17/2023 访问量:73

问:

我目前在使用 C# 中的 Newtonsoft JSON 序列化将对象属性转换为小驼峰大小写时遇到困难。这是我正在使用的代码的简化版本:

[JsonObject(Title = "booking")]
public class BookingJsonModel
{
    [JsonProperty("id")]
    public Guid Id { get; set; }

    [JsonProperty("reference")]
    public string Reference { get; set; } = null!;
    //...
}

我还尝试声明一个属性:

[JsonProperty(PropertyName = "reference")]
public string Reference { get; set; } = null!;

在序列化过程中,我尝试使用以下代码将属性名称转换为小驼峰大小写:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

string body = JsonConvert.SerializeObject(data, settings);

尽管将 ContractResolver 设置为 ,但属性保持不变,并且仍以大写字母开头。在序列化过程中,似乎同时忽略了 ContractResolver 和 JsonProperty 属性。CamelCasePropertyNamesContractResolver()

有人可以提供指导或建议一种替代方法来确保使用 C# 中的 Newtonsoft JSON 库将对象属性序列化为小驼峰大小写吗?对此问题的任何见解或解决方案将不胜感激。谢谢!

C# JSON json.net

评论

4赞 Ralf 11/17/2023
简单工作,见 dotnetfiddle.net/Ss3CHW
1赞 derpirscher 11/17/2023
您的代码应该可以正常工作。检查所有涉及的类型是否都正确解析为命名空间。由于某些类型在 .net 内置中的名称相同,如果它们解析为错误的程序集,则无法正确使用它们。JsonPropertyNewtonsoft.JsonSystem.Text.Json
2赞 derpirscher 11/17/2023
除了@Ralf这里还有一把小提琴,它也演示了工作精细 dotnetfiddle.net/YzAHCZ 但有一件事要考虑:如果你同时拥有合约解析器和注释,后者将永远“获胜”......CamelCasePropertyNamesContractResolverJsonProperty

答:

0赞 Morten Bork 11/17/2023 #1

[JsonProperty("some name")]
public string SomeName {get;set;}

将原始 JSON 字符串中的属性名称“some name”映射到类定义中的 SomeName 属性。

如果已将类定义为使用属性名称“SomeName”,则模型上的大写字母是 JSON 将字符串映射到 INTO 的内容。

如果您希望自己的模型具有小写单词,只需这样定义您的模型即可。

所以它变成了

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

但是,这违反了正常的命名约定,即属性应以大写字母开头。

或者,使用

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]

注释,这实际上应该解决您想要的问题。

评论

0赞 Peter B 11/17/2023
[JsonProperty = "some name"]语法无效。此外,您提出的 [JsonProperty] 正是他们已经拥有的。最后,这与重命名 C# 属性无关。
0赞 Morten Bork 11/17/2023
@PeterB更正了语法,但是,如果不是重命名属性,我希望作者更具体一点,因为我看不出它还能说什么?或者也许你可以?OP 中的“使用下驼峰大小写的对象属性”qoute,那它是关于什么的?
0赞 Peter B 11/17/2023
他们问“我认为我做的一切都是对的,但它仍然不起作用”(然后评论说“它在我的小提琴上起作用”)。我没有他们的问题的答案,但是当我看到一个(IMO)不正确或没有解决任何问题的答案时,我会大声疾呼。
0赞 derpirscher 11/17/2023
这确实是关于重命名 JSON 和 C# 之间的属性。但这不是一个“我该怎么做?”的问题,而是“为什么这不起作用”的问题,而你提出的是完全一样的事情,据称OP已经这样做了。
0赞 Morten Bork 11/17/2023
@derpirscher我不是在提议他已经在做什么,但我强调他可能会违反命名约定,并改变他自己的模型,我给他一个替代属性类型来尝试和用于实现同样的事情,考虑到它应该起作用。这可能会对他有所帮助。但是他没有提供足够的代码来复制结果,所以你的评论无关紧要?
-3赞 Habib Ahmad 11/17/2023 #2

如果在 C# 中使用 Newtonsoft.Json,并且想要将属性名称转换为小驼峰大小写(例如,myProperty 而不是 MyProperty),则可以通过使用 ContractResolver 属性配置 JsonSerializerSettings 来实现此目的。

下面是如何配置 Newtonsoft.Json 以序列化具有小驼峰大小写属性名称的对象的示例:

   using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

class Program
{
    static void Main()
    {
        // Your object to serialize
        var myObject = new MyClass { MyProperty = "SomeValue", AnotherProperty = 42 };

        // Configure JsonSerializerSettings with CamelCasePropertyNamesContractResolver
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Formatting.Indented // Optional: for pretty-printing the JSON
        };

        // Serialize the object to JSON with lower camel case property names
        string json = JsonConvert.SerializeObject(myObject, settings);

        // Output the JSON
        Console.WriteLine(json);
    }
}

public class MyClass
{
    public string MyProperty { get; set; }
    public int AnotherProperty { get; set; }
}

查看参考输出

评论

3赞 Peter B 11/17/2023
看起来您使用了 ChatGPT,令人惊讶的是,它准确地生成了提问者已经拥有的代码(只是没有 JsonProperty 属性)。下次最好阅读问题中已有的内容,而不是发布与问题中的内容重复的答案。
0赞 Community 11/18/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。