2013-02-26 3 views
13

Как преобразовать общий JObject в прямую строку json camelCase? Я попытался с JsonSerializerSettings, но не работает (Newtonsoft.Json 4.5.11)Преобразование JObject & CamelCase с помощью 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); 

Edit:

Хороший вопрос о 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

не думаю, что сериализация + десериализация + сериализация слишком эффективна. –

+1

как обходной путь Я переключился с JObject do Dictionary . –

+0

@AndreaBalducci См. Мое редактирование. –

20

Этот вопрос начинается с объекта JObject и хочет работать с объектом JSON с верблюжьим корпусом. Если вы на самом деле, начиная с объекта и хотите, чтобы добраться до JObject, уже camelcased, то вы можете сделать это:

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

В результате «дзе» будет camelcased.

+1

Это должен быть принятый ответ. – ssougnez

+0

Как я могу выполнить противоположное: 'JObject.Load (jsonReader)', указав резольвер? – Shimmy

3

От this 8 мая 2013 г. в блоге Джеймса Ньютона-короля относительно выпуска 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" 
// } 
Смежные вопросы