2016-10-25 1 views
4

文字列へのJObjectのシリアル化を制御するにはどうすればよいですか?Json.NETを使ってオブジェクトと同じ方法でJObjectを直列化する方法は?

私はJObjectを返すいくつかのAPIを持っていますが、私は通常いくつかの変更を適用し、それらを永続化または返すことがあります。私はnullプロパティを永続化しないようにし、いくつかの追加の書式設定を適用したいが、JsonConvertは設定を完全に無視するようだ。ここで

が問題のサンプルです:

// startup.cs has the following 
services.AddMvc().AddJsonOptions(o => 
{ 
    o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; 
}); 

public class SampleController : Controller 
{ 
    JsonSerializerSettings _settings = new JsonSerializerSettings 
    { 
     NullValueHandling = NullValueHandling.Ignore 
    }; 

    [HttpPost] 
    [Route("object")] 
    public object PostObject([FromBody] SomeObject data) 
    { 
     return JsonConvert.SerializeObject(data, _settings); 
    } 

    [HttpPost] 
    [Route("jobject")] 
    public object PostJObject([FromBody] JObject data) 
    { 
     return JsonConvert.SerializeObject(data, _settings); 
    } 

    public class SomeObject 
    { 
     public string Foo { get; set; } 
     public string Bar { get; set; } 
    } 
} 

{ "Foo": "Foo", "Bar": null }投稿:

  • /object戻り{"Foo":"Foo"}
  • /jobject戻り{"Foo":"Foo","Bar":null}

私が欲しいですJObjectメソッドはオブジェクトを使用しているのと同じ出力jsonを返します。ヘルパーを作成せずにこれをどのように達成できますか?同じ設定を使用してJObjectをシリアル化する方法はありますか?

+0

は 'JObject'はJSONを返す' ToString'メソッドを持っていませんか? –

+0

JsonConvert.SerializObject()でシリアル化中に 'JObject'を編集することはできません。 'JObject'は既にシリアライズされています。すべての' JsonConvert'がやっていることは、それを多かれ少なかれ放出します。 「[Newtonsoft Json.Net serialize JObjectは正しい設定でもnullを無視しません](https://stackoverflow.com/questions/29258587)」を参照してください。回避策については、[JSON.NET serialize JObject with null properties](https://stackoverflow.com/questions/33027409)を参照してください。 – dbc

+0

@MikeMcCaughan JObject.ToStringはオブジェクトをjsonに変換しますが、受け入れるオーバーロードはありません設定オブジェクト – Natan

答えて

-1

JObjectがシリアル化されると、生のJSONが書き込まれます。 JsonSerializerSettingsは書かれたJSONには影響しません。

+3

-1;この答えは私には何の意味もありません。 'JObject'の"生のJSON "とは何ですか?この用語は 'JObject'ドキュメントでは使われておらず、特に' JObject'にJSON仕様の一部ではない 'JToken'sのような日付とGUIDを含むことができ、可能な複数の直列化。 –

0

私はこれを行うことができた唯一の方法は、最初の(あなたがJObjectを取り戻すだろうからobjectにデシリアライズしません)ExpandoObjectにその文字列をデシリアライズ、その後、stringJObjectを変換することによってです。 ExpandoObjectは辞書のようなものなので、JsonConvertは実際に構成された名前の大文字小文字を使用します。私はなぜNewtonsoft.Jsonの作者がJObject型を辞書型のように扱っているのと同じ方法で処理しなかったのか分かりませんが、少なくともこの問題は回避しています。

例:

// Construct a JObject. 
var jObject = JObject.Parse("{ SomeName: \"Some value\" }"); 

// Deserialize the object into an ExpandoObject (don't use object, because you will get a JObject). 
var payload = JsonConvert.DeserializeObject<ExpandoObject>(jObject.ToString()); 

// Now you can serialize the object using any serializer settings you like. 
var json = JsonConvert.SerializeObject(payload, new JsonSerializerSettings 
{ 
    ContractResolver = new DefaultContractResolver 
    { 
     NamingStrategy = new CamelCaseNamingStrategy 
     { 
      // Important! Make sure to set this to true, since an ExpandoObject is like a dictionary. 
      ProcessDictionaryKeys = true, 
     } 
    } 
} 
); 

Console.WriteLine(json); // Outputs: {"someName":"Some value"} 

私がピックアップされたトリックをここにExpandoObjectで:JObject & CamelCase conversion with JSON.Net

関連する問題