web-dev-qa-db-fra.com

Conversion JObject & CamelCase avec JSON.Net

Comment puis-je convertir un objet JO générique en chaîne jel camelCase? ?__. J'ai essayé avec JsonSerializerSettings mais ne fonctionne pas (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);
}

UPDATE Selon http://json.codeplex.com/workitem/23853 qui ne peut pas être effectué (tnx à @nick_w pour le lien)

24
Andrea Balducci

Cette question commence à partir d'un objet JO et veut travailler sur un objet JSON au boîtier chameau. Si vous partez réellement d'un objet et souhaitez atteindre un JObject déjà camelcased, vous pouvez le faire:

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

Le "jo" résultant sera camelcased.

27
Steve Benz

Selon ce problème de Json.NET , lors de la sérialisation d'une JObject de cette manière, le résolveur de contrat est ignoré:

Lors de la sérialisation d'un objet JObject, les résolveurs de contrat semblent être ignorés. Ce n’est sûrement pas ce que cela est supposé être. 
Fermé le 30 janvier 2013 à 8h50 par JamesNK
Cela a du sens, mais je crains que ce soit un trop grand changement.

Inspiré par la solution de contournement sur cette page, vous pourriez faire quelque chose comme ceci:

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

Modifier:

Bon point à propos du Dictionary<string, object>. Ainsi, cette méthode ignore le JsonConvert.SerializeObject supplémentaire, mais réduit également le besoin de la ExpandoObject, ce qui est important si vous utilisez .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);
11
nick_w

Depuis le ce billet de blog du 8 mai 2013 de James Newton-King concernant la version 5.0 de Json.NET, cette question a été corrigée avec l'ajout de «DefaultSettings». L'exemple de cette page suit mais lisez-la pour plus de détails sur les bibliothèques tierces.

// 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"
// }
5
Adam Hiler
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());

}

0
rafiq J