How do I control the serialization of a JObject to string?
I have some APIs that return a JObject and I usually apply some changes and persist or return them. I want
The only way I was able to do this is by first converting the JObject
to a string
, then deserializing that string into an ExpandoObject
(don't deserialize to object
because you'll get back a JObject
). The ExpandoObject
is like a dictionary, which will cause JsonConvert
to actually invoke the configured name case strategy. I'm not sure why the author of Newtonsoft.Json didn't handle JObject types the same way as they seem to be doing for dictionary types, but at least this work around works.
Example:
// Construct a JObject.
var jObject = JObject.Parse("{ SomeName: \"Some value\" }");
// Deserialize the object into an ExpandoObject (don't use object, because you will get a JObject).
var payload = JsonConvert.DeserializeObject(jObject.ToString());
// Now you can serialize the object using any serializer settings you like.
var json = JsonConvert.SerializeObject(payload, new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy
{
// Important! Make sure to set this to true, since an ExpandoObject is like a dictionary.
ProcessDictionaryKeys = true,
}
}
}
);
Console.WriteLine(json); // Outputs: {"someName":"Some value"}
I picked-up the trick with the ExpandoObject
here: JObject & CamelCase conversion with JSON.Net