【问题标题】:JObject & CamelCase conversion with JSON.Net使用 JSON.Net 进行 JObject 和 CamelCase 转换
【发布时间】:2013-02-26 10:58:29
【问题描述】:

如何将通用 JObject 转换为 camelCase 纯 json 字符串? 我试过 JsonSerializerSettings 但不起作用(Newtonsoft.Json 4.5.11)

[Test]
public void should_convert_to_camel_case()
{
    var serializer = JsonSerializer.Create(new JsonSerializerSettings()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    });

    var jo = new JObject();
    jo["CamelCase"] = 1;

    var stringWriter = new StringWriter();
    var writer = new JsonTextWriter(stringWriter);
    serializer.Serialize(writer,jo);

    var serialized = stringWriter.ToString();

    Assert.AreEqual("{\"camelCase\":1}", serialized);
}

更新 根据http://json.codeplex.com/workitem/23853 无法完成(tnx 到@nick_w 获取链接)

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    这个问题从一个 JObject 开始,想要处理一个驼峰式 JSON 对象。如果您实际上是从一个对象开始并想要获得一个已经被驼峰​​化的 JObject,那么您可以这样做:

    var serializer = new JsonSerializer()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    };
    var jo = JObject.FromObject(someDataContract, serializer);
    

    生成的 'jo' 将被驼峰化。

    【讨论】:

    • 我怎样才能通过指定解析器来执行相反的操作:JObject.Load(jsonReader)
    • JObject实例方法ToObject<T>(serializer)试过这个,但它不起作用
    • JObject 没有序列化,它是“按原样”写的,所以这个答案是行不通的。
    【解决方案2】:

    根据this Json.NET issue,当以这种方式序列化JObject 时,合约解析器被忽略:

    在序列化 JObject 时,合同解析器似乎被忽略了。这肯定不是应该的样子吗?
    2013 年 1 月 30 日上午 8:50 JamesNK 关闭
    这确实有道理,但恐怕这是一个太大的突破性变化。

    受该页面上解决方法的启发,您可以执行以下操作:

    var jo = new JObject();
    jo["CamelCase"] = 1;
    
    string json = JsonConvert.SerializeObject(jo);
    var jObject = JsonConvert.DeserializeObject<ExpandoObject>(json);
    
    var settings = new JsonSerializerSettings()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    };
    
    var serialized = JsonConvert.SerializeObject(jObject, settings);
    
    Assert.AreEqual("{\"camelCase\":1}", serialized);
    

    编辑:

    关于Dictionary&lt;string, object&gt; 的优点。因此,这样做会跳过额外的 JsonConvert.SerializeObject,但它也减少了对 ExpandoObject 的需求,如果您使用的是 .NET 3.5,这一点很重要。

    Dictionary<string, object> jo = new Dictionary<string, object>();
    jo.Add("CamelCase", 1);
    
    var settings = new JsonSerializerSettings()
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    };
    
    var serialized = JsonConvert.SerializeObject(jo, settings);
    
    Assert.AreEqual("{\"camelCase\":1}", serialized);
    

    【讨论】:

    • 不要觉得serialize + deserialize + serialize效率太高。
    • 作为一种解决方法,我已从 JObject do Dictionary 切换。
    • 谢谢,我用Dictionary&lt;string,object&gt;
    【解决方案3】:

    截至this James Newton-King 于 2013 年 5 月 8 日发布的关于 Json.NET 5.0 版本的博文,已通过添加“DefaultSettings”解决此问题。该页面的示例如下,但请阅读该页面以了解第 3 方库的详细信息。

    // settings will automatically be used by JsonConvert.SerializeObject/DeserializeObject
    JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
        Formatting = Formatting.Indented,
        ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    
    Employee e = new Employee
        {
        FirstName = "Eric",
        LastName = "Example",
        BirthDate = new DateTime(1980, 4, 20, 0, 0, 0, DateTimeKind.Utc),
        Department = "IT",
        JobTitle = "Web Dude"
        };
    
    string json = JsonConvert.SerializeObject(e);
    // {
    //   "firstName": "Eric",
    //   "lastName": "Example",
    //   "birthDate": "1980-04-20T00:00:00Z",
    //   "department": "IT",
    //   "jobTitle": "Web Dude"
    // }
    

    【讨论】:

      【解决方案4】:
      public static JsonSerializer FormattingData()
      {
         var jsonSerializersettings = new JsonSerializer {
         ContractResolver = new CamelCasePropertyNamesContractResolver() };
         return jsonSerializersettings;
      }
      
      
      public static JObject CamelCaseData(JObject jObject) 
      {   
         var expandoConverter = new ExpandoObjectConverter();
         dynamic camelCaseData = 
         JsonConvert.DeserializeObject(jObject.ToString(), 
         expandoConverter); 
         return JObject.FromObject(camelCaseData, FormattingData());
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        相关资源
        最近更新 更多