38

一般的な 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 によると、これは実行できません (リンクについては @nick_w への tnx)

4

4 に答える 4

46

この質問は JObject から始まり、キャメル ケースの JSON オブジェクトに取り組みたいと考えています。実際にオブジェクトから始めて、すでにキャメルケース化されている JObject に到達したい場合は、次のようにできます。

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

結果の「jo」はキャメルケース化されます。

于 2015-01-26T19:13:42.590 に答える
22

このJson.NETの問題によると、この方法でシリアル化すると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<string, object>。したがって、この方法で追加をスキップしますが、.NET3.5を使用している場合に重要なJsonConvert.SerializeObjectの必要性も軽減されます。ExpandoObject

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);
于 2013-02-27T07:46:58.277 に答える
6

2013年 5 月 8 日の James Newton-King による Json.NET の 5.0 リリースに関するブログ投稿の時点で、これは "DefaultSettings" の追加で対処されていますそのページの例は次のとおりですが、サードパーティのライブラリの詳細についてはページをお読みください。

// 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"
// }
于 2015-06-25T18:19:20.657 に答える