json.NET中的camelCase JRaw序列化

时间:2018-04-17 01:32:20

标签: c# json.net

假设我有一个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}}"

1 个答案:

答案 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}}