Json.NET中JRaw序列化时如何将内部JSON转为驼峰式命名?
解决JRaw内容在驼峰序列化时不转换属性名的问题
这个问题的核心原因其实很直接:JRaw的设计就是直接输出原始JSON字符串,JSON.NET在序列化过程中会跳过对它内部内容的解析和处理,所以里面的帕斯卡命名属性自然不会被转换成驼峰格式。要解决这个问题,有两种实用的思路:
思路一:替换JRaw为可解析的JToken类型
如果你的业务场景允许,别直接用JRaw存储JSON字符串,而是先把字符串解析成JObject(或对应的JToken子类)。这样JSON.NET的驼峰解析器就能遍历处理里面的所有属性名了。
示例代码:
public class C { public JToken Prop { get; set; } } // 将JRaw替换为JToken/JObject // 初始化时解析JSON字符串 var jObj = JObject.Parse("{\"A\":42}"); var c = new C { Prop = jObj }; // 执行序列化 var result = JsonConvert.SerializeObject(c, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
最终输出结果会是:{"prop":{"a":42}},内部的"A"也成功转成了"a"。
思路二:自定义JsonConverter处理JRaw
如果必须保留JRaw类型(比如有特定的业务约束),可以写一个自定义转换器,在序列化时手动解析JRaw的内容,应用驼峰规则后再输出。
自定义转换器代码:
public class CamelCaseJRawConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(JRaw).IsAssignableFrom(objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var jRaw = (JRaw)value; // 把JRaw的原始内容解析为JToken var token = JToken.Parse(jRaw.ToString()); // 用当前序列化器的设置(包含驼峰解析器)序列化这个token serializer.Serialize(writer, token); } // 该转换器仅处理序列化,反序列化可直接抛出异常 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException("此转换器仅支持序列化操作"); } }
使用这个转换器的示例:
var a = new JRaw("{\"A\":42}"); var c = new C { Prop = a }; var result = JsonConvert.SerializeObject(c, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List<JsonConverter> { new CamelCaseJRawConverter() } // 添加自定义转换器 });
这样输出结果同样是:{"prop":{"a":42}},完美解决JRaw内部属性名的转换问题。
内容的提问来源于stack exchange,提问作者zaitsman
相关产品推荐
相关产品推荐

