2016-08-17 62 views
3

我们有一个Json.NET设置程序,它将合同解析器设置为CamelCasePropertyNamesContractResolver。但是,对于某些类型,我想选择退出camelCasing行为。是否有可能通过某种方式注释这些类型?如何退出JSON合约解析器

+1

您使用的是什么版本的.NET? – Delosdos

+0

是任何用途:http://stackoverflow.com/questions/19956838/force-camelcase-on-asp-net-webapi-per-controller你可以设置每个控制器的解析器。 – Delosdos

+1

@Delosdos这是针对.NET 4.6库的,不适用于特定的Web框架。 – ChaseMedallion

回答

3

是的,截至Json.Net version 9.0.1(2016年6月),[JsonObject][JsonProperty]属性均支持NamingStrategyType参数。因此,您可以使用CamelCasePropertyNamesContractResolver来设置默认的命名方案,但选择退出或甚至将这些属性更改为使用特定类或属性的不同策略。

这里是一个简短的演示:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Foo foo = new Foo 
     { 
      CamelCasedProperty = "abc def", 
      AlsoCamelCasedButChildPropsAreNot = new Bar 
      { 
       SomeProperty = "fizz buzz", 
       AnotherProperty = "whiz bang" 
      }, 
      ThisOneOptsOutOfCamelCasing = "blah blah", 
      ThisOneIsSnakeCased = "senssssational" 
     }; 

     var settings = new JsonSerializerSettings 
     { 
      // set up default naming scheme 
      ContractResolver = new CamelCasePropertyNamesContractResolver(), 
      Formatting = Formatting.Indented 
     }; 

     string json = JsonConvert.SerializeObject(foo, settings); 
     Console.WriteLine(json); 
    } 
} 

class Foo 
{ 
    public string CamelCasedProperty { get; set; } 
    public Bar AlsoCamelCasedButChildPropsAreNot { get; set; } 

    [JsonProperty(NamingStrategyType = typeof(DefaultNamingStrategy))] 
    public string ThisOneOptsOutOfCamelCasing { get; set; } 

    [JsonProperty(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] 
    public string ThisOneIsSnakeCased { get; set; } 
} 

[JsonObject(NamingStrategyType = typeof(DefaultNamingStrategy))] 
class Bar 
{ 
    public string SomeProperty { get; set; } 
    public string AnotherProperty { get; set; } 
} 

输出:

{ 
    "camelCasedProperty": "abc def", 
    "alsoCamelCasedButChildPropsAreNot": { 
    "SomeProperty": "fizz buzz", 
    "AnotherProperty": "whiz bang" 
    }, 
    "ThisOneOptsOutOfCamelCasing": "blah blah", 
    "this_one_is_snake_cased": "senssssational" 
} 

小提琴:

+0

如果我没有访问类Bar(因为它来自第三方),但我实际上是想强制AlsoCamelCasedButChildPropsAreNot以使其具有其属性CamelCase?有没有办法通过属性装饰器来做到这一点?请参阅[问题](https://stackoverflow.com/questions/46326475/how-can-i-make-the-properties-of-sub-class-camel-case) – CodeHacker