2013-02-26 150 views
13

我如何转换的通用JObject到驼峰纯JSON字符串? 我试着JsonSerializerSettings但不工作(Newtonsoft.Json 4.5.11)JObject与驼峰转换与JSON.Net

[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); 
} 

UPDATE 根据http://json.codeplex.com/workitem/23853不能做(TNX到@nick_w的链接)

回答

6

this,序列化JObject这样,当合同解析器被忽略。通过页面上的解决方法的启发,你可以做这样的事情:

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); 

编辑:

有关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); 
+1

不认为序列化+反序列化+序列化过于高效。 – 2013-02-27 11:47:14

+1

作为解决方法我已经从JObject转换到Dictionary 。 – 2013-02-27 11:48:04

+0

@AndreaBalducci查看我的编辑。 – 2013-02-27 19:49:06

20

这个问题从一个JObject开始,希望工作到一个驼峰式的JSON对象。如果你实际上是从一个对象开始,你想获得到已经一个驼峰JObject,那么你可以这样做:

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

产生的“JO”,将驼峰格式。

+1

这应该是被接受的答案。 – ssougnez 2017-03-22 16:38:24

+0

如何执行相反的操作:'JObject.Load(jsonReader)'指定解析器? – Shimmy 2017-12-07 00:16:56

3

this截止到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" 
// }