关于Json.NET中的c#:camelCase JRaw序列化

camelCase JRaw serialization in Json.NET

说我有一个JRaw属性,我将Pascal大小写的JSON放入其中。

1
2
3
4
5
6
7
public class C
{
   public JRaw Prop {get;set;}
}

var a = new JRaw("{"A":42}");
var c = new C { Prop = a };

现在,当我对此序列化时,我可以强制将c转换为小写,如下所示:

1
2
3
4
5
var result = JsonConvert.SerializeObject(c, new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });
// i have"{"c":{"A":42}}"

但是,有什么方法可以使JRaw也被驼峰package吗?
例如我想得到

1
//"{"c":{"a":42}}"


这是一种方法,尽管它可能不是最有效的,因为它需要您序列化对象,反序列化然后再次序列化它。我相信问题是序列化程序无法正确检测到您的" A" JSON属性,因为它是原始JSON字符串,而不是对象属性。这会将您的JRaw JSON字符串转换为动态对象(ExpandoObject),从而允许" A" JSON属性临时变为对象属性。对象被序列化后,序列化程序将对此进行拾取,导致所有嵌套的属性键均为驼峰式大小写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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}}