假设我有一个JRaw
属性,我将Pascal套装的JSON放入其中。
public class C
{
public JRaw Prop {get;set;}
}
var a = new JRaw("{\"A\":42}");
var c = new C { Prop = a };
现在当我序列化时,我可以强制c
为小写,如下所示:
var result = JsonConvert.SerializeObject(c, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
// i have "{\"c\":{\"A\":42}}"
但是,还有什么方法可以使JRaw
变得更好吗?
例如我想要
// "{\"c\":{\"a\":42}}"
答案 0 :(得分:1)
这是一种方法,虽然它可能不是最有效的,因为它要求您序列化对象,反序列化,然后再次序列化它。我相信问题是序列化程序没有检测到你的" A" JSON属性正确,因为它是一个原始JSON字符串而不是对象属性。这会将您的JRaw JSON字符串转换为动态对象(ExpandoObject
),从而允许" A" JSON属性暂时成为对象属性。然后,一旦对象被序列化,序列化器就会拾取这个,导致所有嵌套的属性键都是驼峰式的。
using System;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System.Dynamic;
public class Program
{
public class C
{
public JRaw Prop { get; set; }
}
public static void Main()
{
var a = new JRaw("{\"A\":42}");
var c = new C { Prop = a };
var camelCaseSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var result = JsonConvert.SerializeObject(c, camelCaseSettings);
var interimObject = JsonConvert.DeserializeObject<ExpandoObject>(result);
result = JsonConvert.SerializeObject(interimObject, camelCaseSettings);
Console.WriteLine(result);
Console.ReadKey();
}
}
输出:{"prop":{"a":42}}