C#JSON.NET遵循Ruby属性命名约定的约定?

14 浏览
0 Comments

C#JSON.NET遵循Ruby属性命名约定的约定?

我正在使用http://json.codeplex.com/与基于Ruby的Rest API进行通信。问题是大多数属性都使用了Ruby下划线命名约定。我想知道是否有办法可以避免添加大量的JsonProperty属性。

例如,我希望能够避免添加JsonProperty属性,并在序列化器设置中设置一个约定,使其能够自动将具有下划线的属性映射到.NET命名约定中:)

public class Member
{
    [JsonProperty(PropertyName = "avatar_url")]
    public string AvatarUrl { get; set; }
    [JsonProperty(PropertyName = "twitter_screen_name")]
    public string TwitterScreenName { get; set; }
    [JsonProperty(PropertyName = "website_url")]
    public string WebSiteUrl { get; set; }
}

0
0 Comments

问题的出现原因是希望在C#中使用JSON.NET库来实现Ruby属性命名约定。然而,JSON.NET默认使用驼峰命名法,与Ruby属性命名约定不一致。因此,需要找到一种方法来解决这个问题。

解决方法是通过继承`DefaultContractResolver`类并重写`ResolvePropertyName`方法来自定义属性命名。另外,还可以使用`CamelCasePropertyNamesContractResolver`类来实现类似的全局属性命名更改。

另外,也可以使用`SnakeCaseNamingStrategy`类来自动实现类似于`twitter_screen_name`样式的属性命名。

在使用命名策略的过程中可能会遇到性能问题。创建新的命名策略对象会导致每次序列化/反序列化时都进行反射操作,从而降低吞吐量。为了解决这个问题,可以重用命名策略对象,避免每次都创建新的对象。

总结起来,为了在C#中实现Ruby属性命名约定,可以通过继承`DefaultContractResolver`类并重写`ResolvePropertyName`方法来自定义属性命名,或者使用`CamelCasePropertyNamesContractResolver`类实现全局属性命名更改。此外,还可以使用`SnakeCaseNamingStrategy`类来自动实现类似于`twitter_screen_name`样式的属性命名。在使用命名策略时,需要注意性能问题,可以通过重用命名策略对象来提高性能。

0
0 Comments

问题的原因是在使用C#的JSON.NET库时,遵循了Ruby属性命名约定,但是在处理具有连续两个大写字母的属性时出现了错误。例如,属性"ThisIsATest"被转换为"this_is_atest",而不是预期的"this_is_a_test"。

为了解决这个问题,可以使用以下代码示例中的自定义解析器类UnderscoreMappingResolver,并将其作为JSON.NET库的默认解析器。这个解析器使用正则表达式来处理属性命名,将连续的大写字母分割为下划线和小写字母。

public class UnderscoreMappingResolver : DefaultContractResolver 
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return System.Text.RegularExpressions.Regex.Replace(
            propertyName, @"([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])", "$1$3_$2$4").ToLower(); 
    }
}

通过将这个解析器类设置为JSON.NET库的默认解析器,可以确保属性命名遵循Ruby的命名约定,包括处理连续的大写字母。

更多关于这个问题的信息可以在这个链接中找到:http://nyqui.st/json-net-newtonsoft-json-lowercase-keys

0
0 Comments

在C#中,属性命名通常遵循PascalCase命名约定,即每个单词首字母大写。然而,有时候我们可能需要遵循Ruby的属性命名约定,即snake_case命名约定,其中单词之间使用下划线分隔。

问题的出现是因为在C#中使用JSON.NET库进行JSON序列化时,默认情况下属性命名会遵循PascalCase命名约定,而不是Ruby的snake_case命名约定。因此,当我们需要将C#对象序列化为符合Ruby属性命名约定的JSON时,就需要解决这个问题。

解决方法是使用JSON.NET库的一个新的命名策略属性,该属性可以将属性命名转换为snake_case。这个命名策略属性是SnakeCaseNamingStrategy类,它可以在版本9中使用。

以下是解决方法的代码示例:

var contractResolver = new DefaultContractResolver();
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy();

上述代码将创建一个DefaultContractResolver对象,并将其命名策略设置为SnakeCaseNamingStrategy。这样,在序列化时,属性命名将会按照snake_case命名约定进行转换。

然而,默认情况下,SnakeCaseNamingStrategy类不会处理字典类型的属性,也不会覆盖任何手动设置的属性值。为了解决这两个问题,可以通过在SnakeCaseNamingStrategy的构造函数中传入两个参数来实现:

contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(true, false);

上述代码中,第一个参数为true,表示强制处理字典类型的属性;第二个参数为false,表示不覆盖任何手动设置的属性值。

通过以上解决方法,我们可以在C#中使用JSON.NET库来实现符合Ruby属性命名约定的JSON序列化。

0