Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON序列化中属性名称的默认驼峰大小写_C#_Json_Json.net_Camelcasing - Fatal编程技术网

C# JSON序列化中属性名称的默认驼峰大小写

C# JSON序列化中属性名称的默认驼峰大小写,c#,json,json.net,camelcasing,C#,Json,Json.net,Camelcasing,我有一堆类将在某个时候序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我定义了如下属性: [JsonProperty(PropertyName="myFoo")] public int MyFoo { get; set; } JsonConvert.DefaultSettings = () => new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesCon

我有一堆类将在某个时候序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我定义了如下属性:

[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
 JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
 {
   ContractResolver = new CamelCasePropertyNamesContractResolver()
 };
因此,在C#中,我可以:

在Javascript中,我可以:

if (myFoo === 10)
但对每一处房产这样做都是乏味的。是否有一种快速简便的方法来设置JSON.Net处理属性名称的默认方式,以便在没有其他说明的情况下自动处理大小写?

您可以使用自定义:


因为接受的答案是linkonly,所以我添加了我最终使用的实际代码(以防链接失效)。这与链接中的内容基本相同:

// Automatic camel casing because I'm bored of putting [JsonProperty] on everything
// See: http://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl
public class CamelCase : CamelCasePropertyNamesContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,
        MemberSerialization memberSerialization)
    {
        var res = base.CreateProperty(member, memberSerialization);

        var attrs = member.GetCustomAttributes(typeof(JsonPropertyAttribute), true);

        if (attrs.Any())
        {
            var attr = (attrs[0] as JsonPropertyAttribute);
            if (res.PropertyName != null && attr.PropertyName != null)
                res.PropertyName = attr.PropertyName;
        }

        return res;
    }
}
我所做的唯一更改是添加了
attr.PropertyName!=null
添加到if子句中,因为我添加了如下内容:

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }

并且不想指定
属性名称
(因此为空)。上述内容将在JSON中序列化为
someProperty

,您可以使用提供的类:


换句话说,您不必自己创建自定义解析程序。

序列化对象时,传入一些自定义设置

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var json = JsonConvert.SerializeObject(yourObject, settings);

JObject.FromObject
使用
JsonConvert
默认设置。 有一个func属性,您可以这样指定:

[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
 JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
 {
   ContractResolver = new CamelCasePropertyNamesContractResolver()
 };
无论何时调用
Jobject.FromObject
,它都将使用此函数构造设置。

最好使用新的(因为):

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var json = JsonConvert.SerializeObject(yourObject, settings);

默认情况下,它不会覆盖由
JsonPropert('Name')
设置的自定义名称。(您可以通过
CamelCaseNamingStrategy(bool,bool)
ctor来更改行为。)因此,不需要像@Matt Burland的答案那样创建自定义类。

CamelCasePropertyNamesContractResolver
实际上已经存在很长时间了。它至少早在2011年4月21日就出现了。如果你注意到,OP的解析器甚至继承了它。我想你指的是问这个问题的人。那里没有提到这件事。不过,这很好。是否可以将解析器指定为类的属性?不确定这与@DaveKennedy的答案有多大区别。请看这两个区别。a)
JsonSerializer
vs
JsonSerializerSettings
然后b)
JsonConvert.XX
vs
JObject.XX
。问题的关键是
CamelCasePropertyNamesContractResolver
,其他一切都是次要的。查看哪里可以使用ContractResolver仍然很有用。Expand object有助于解析将Pascalcase转换为CamelCase您是否碰巧知道哪一个是包含CamelCaseNamingStrategy的第一个Newtonsoft.Json版本?@vezenkov,根据changelog。
public static JsonSerializer FormattingData()
{
   var jsonSerializersettings = new JsonSerializer {
   ContractResolver = new CamelCasePropertyNamesContractResolver() };
   return jsonSerializersettings;
}


public static JObject CamelCaseData(JObject jObject) 
{   
     var expandoConverter = new ExpandoObjectConverter();
     dynamic camelCaseData = 
     JsonConvert.DeserializeObject(jObject.ToString(), 
     expandoConverter); 
     return JObject.FromObject(camelCaseData, FormattingData());
}
new JsonSerializerSettings()
{
    ContractResolver = new DefaultContractResolver
    {
       NamingStrategy = new CamelCaseNamingStrategy()
    }
};
public static JsonSerializer FormattingData()
{
   var jsonSerializersettings = new JsonSerializer {
   ContractResolver = new CamelCasePropertyNamesContractResolver() };
   return jsonSerializersettings;
}


public static JObject CamelCaseData(JObject jObject) 
{   
     var expandoConverter = new ExpandoObjectConverter();
     dynamic camelCaseData = 
     JsonConvert.DeserializeObject(jObject.ToString(), 
     expandoConverter); 
     return JObject.FromObject(camelCaseData, FormattingData());
}