C# JObject&;使用JSON.Net进行CamelCase转换

C# JObject&;使用JSON.Net进行CamelCase转换,c#,json.net,C#,Json.net,如何将通用JObject转换为camelCase纯json字符串? 我尝试过JsonSerializerSettings,但没有成功(Newtonsoft.Json 4.5.11) 更新 根据无法完成的操作(链接为tnx到@nick_w)根据,当序列化作业对象时,以这种方式忽略合同解析程序: 序列化作业对象时,似乎忽略了契约解析程序。这肯定不是应该的情况吗? 于2013年1月30日上午8:50由 这确实有道理,但恐怕这是一个太大的突破性变化 受该页面解决方案的启发,您可以执行以下操作: var

如何将通用JObject转换为camelCase纯json字符串? 我尝试过JsonSerializerSettings,但没有成功(Newtonsoft.Json 4.5.11)

更新 根据无法完成的操作(链接为tnx到@nick_w)

根据,当序列化作业对象时,以这种方式忽略合同解析程序:

序列化作业对象时,似乎忽略了契约解析程序。这肯定不是应该的情况吗?
于2013年1月30日上午8:50由
这确实有道理,但恐怕这是一个太大的突破性变化

受该页面解决方案的启发,您可以执行以下操作:

var jo = new JObject();
jo["CamelCase"] = 1;

string json = JsonConvert.SerializeObject(jo);
var jObject = JsonConvert.DeserializeObject<ExpandoObject>(json);

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

var serialized = JsonConvert.SerializeObject(jObject, settings);

Assert.AreEqual("{\"camelCase\":1}", serialized);

这个问题从一个JObject开始,并希望处理一个驼峰式JSON对象。如果您实际上是从一个对象开始,并且想要访问一个已经camelcased的JObject,那么您可以执行以下操作:

var serializer = new JsonSerializer()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jo = JObject.FromObject(someDataContract, serializer);
由此产生的“jo”将被简化。

截至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"
// }

}

不要认为serialize+deserialize+serialize效率太高。作为一种解决方法,我已从JObject do Dictionary切换。谢谢,我使用了
Dictionary
如何执行相反的操作:
JObject.Load(jsonReader)
通过指定解析程序?使用
JObject
实例方法
来尝试此操作
但它不起作用,我试过了,它不起作用,因为meJObject没有序列化,它是按“原样”编写的,所以这个答案不起作用。
var serializer = new JsonSerializer()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jo = JObject.FromObject(someDataContract, serializer);
// 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"
// }
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());