如何将 newtonsoft 转换为驼峰式对象属性

Dan*_*Eli 3 c# json.net

我有以下代码,newtonsoft camelcases 顶级属性,但不是作为对象传入的属性。

public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
    public object Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

public void Test()
{
    var json = @"
        {
            'Id': 2,
            'Name': 'Foo',
            'Body': {
                'ShipmentId':'6983136',
                'PickupDate':'2019-07-26T17:14:11Z',
                'OrderNumbers':['9638063']
            }
        }";

    var myEvent = JsonConvert.DeserializeObject<Event>(json);
    var camelSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
    var endJson = JsonConvert.SerializeObject(myEvent, camelSettings);
    Console.WriteLine(endJson);
}
Run Code Online (Sandbox Code Playgroud)

这输出:

{"id":2,"name":"Foo","body":{"ShipmentId":"6983136","PickupDate":"2019-07-26T17:14:11Z","OrderNumbers":[" 9638063"]}}

我如何让它对身体内部的属性进行驼峰命名。

Anu*_*wan 5

一种解决方案是使用 ExpandoObject。例如,

var myEvent = JsonConvert.DeserializeObject<ExpandoObject>(json); // Deserialize as ExpandoObject
var camelSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
var endJson = JsonConvert.SerializeObject(myEvent, camelSettings);
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码将 json 反序列化为 ExpandoObject 而不是 Event。这将产生作为 endJson

{"id":2,"name":"Foo","body":{"shipmentId":"6983136","pickupDate":"2019-07-26T17:14:11Z","orderNumbers":["9638063"]}}
Run Code Online (Sandbox Code Playgroud)