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

And*_*cci 31 c# json.net

如何将通用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);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 36

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

var serializer = new JsonSerializer()
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jo = JObject.FromObject(someDataContract, serializer);
Run Code Online (Sandbox Code Playgroud)

由此产生的'jo'将是camelcased.


nic*_*k_w 14

根据这个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<ExpandoObject>(json);

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

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

Assert.AreEqual("{\"camelCase\":1}", serialized);
Run Code Online (Sandbox Code Playgroud)

编辑:

关于这个的好点Dictionary<string, object>.所以这样做会跳过额外的JsonConvert.SerializeObject,但它也减轻了对它的需求ExpandoObject,这对于使用.NET 3.5很重要.

Dictionary<string, object> jo = new Dictionary<string, object>();
jo.Add("CamelCase", 1);

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

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

Assert.AreEqual("{\"camelCase\":1}", serialized);
Run Code Online (Sandbox Code Playgroud)

  • 作为一种解决方法,我已从 JObject 切换到 Dictionary&lt;string, object&gt;。 (2认同)

小智 6

由于这个 2013年5月8日的博客文章由詹姆斯·牛顿国王关于5.0版本Json.NET的,这已讨论了加入"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"
// }
Run Code Online (Sandbox Code Playgroud)