使用JSON.Net进行JObject和CamelCase转换

如何将通用JObject转换为camelCase普通json字符串? 我尝试过使用JsonSerializerSettings但不起作用(Newtonsoft.Json 4.5.11)

[Test] public void should_convert_to_camel_case() { var serializer = JsonSerializer.Create(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }); var jo = new JObject(); jo["CamelCase"] = 1; var stringWriter = new StringWriter(); var writer = new JsonTextWriter(stringWriter); serializer.Serialize(writer,jo); var serialized = stringWriter.ToString(); Assert.AreEqual("{\"camelCase\":1}", serialized); } 

更新根据http://json.codeplex.com/workitem/23853无法完成(tnx到@nick_w的链接)

这个问题从一个JObject开始,想要使用一个基于驼峰的JSON对象。 如果你实际上是从一个对象开始并想要一个已经来过的JObject,那么你可以这样做:

 var serializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var jo = JObject.FromObject(someDataContract, serializer); 

由此产生的’jo’将会变成现实。

根据这个Json.NET问题 ,当以这种方式序列化JObject时,合约解析器会被忽略:

在序列化JObject时,合同解析器似乎被忽略了。 当然这不是它应该是怎样的?
由JamesNK于2013年1月30日上午8:50 关闭
这确实有意义但是我害怕这是一个太大的突破性改变。

受该页面上的变通方法的启发,您可以执行以下操作:

 var jo = new JObject(); jo["CamelCase"] = 1; string json = JsonConvert.SerializeObject(jo); var jObject = JsonConvert.DeserializeObject(json); var settings = new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var serialized = JsonConvert.SerializeObject(jObject, settings); Assert.AreEqual("{\"camelCase\":1}", serialized); 

编辑:

关于Dictionary好点。 这样做可以跳过额外的JsonConvert.SerializeObject ,但它也减轻了对ExpandoObject的需求,这对于使用.NET 3.5很重要。

 Dictionary jo = new Dictionary(); jo.Add("CamelCase", 1); var settings = new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var serialized = JsonConvert.SerializeObject(jo, settings); Assert.AreEqual("{\"camelCase\":1}", serialized); 

截至2013年5月8日James Newton-King关于Json.NET 5.0版本的博客文章,已经通过添加“DefaultSettings”解决了这个问题。 该页面的示例如下,但请阅读页面以获取第三方库的详细信息。

 // settings will automatically be used by JsonConvert.SerializeObject/DeserializeObject JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Formatting = Formatting.Indented, ContractResolver = new CamelCasePropertyNamesContractResolver() }; Employee e = new Employee { FirstName = "Eric", LastName = "Example", BirthDate = new DateTime(1980, 4, 20, 0, 0, 0, DateTimeKind.Utc), Department = "IT", JobTitle = "Web Dude" }; string json = JsonConvert.SerializeObject(e); // { // "firstName": "Eric", // "lastName": "Example", // "birthDate": "1980-04-20T00:00:00Z", // "department": "IT", // "jobTitle": "Web Dude" // }