2016-09-19 7 views
2

私はjson.netの初心者です。Json.netは子オブジェクトのヌル値を無視します

私はUnity3dエンジンでそれを統合する必要があるので、私はnet 2.0バージョンのjson.netを使用しています答えは(nullvaluehandlingを使用して)ちょうど動作しません!私はこれを最も古いバージョンの復元と見なすべきですか?

ので、このようなオブジェクトを持っている:

Object() 
{ 
    ChildObject ChildObject1; 
    ChildObject ChildObject2; 
} 

ChildObject() 
{ 
    Property1; 
    Property2; 
} 

私は子供がオブジェクトを含め、すべてのオブジェクトの唯一のnullでないプロパティシリアライズするjson.netをしたいです。だから私はChildObject1のプロパティ1とChildObject2のproperty2のみをinstatiate場合、JsonConvertから文字列は次のようになります。

{ 
    "ChildObject1": 
     { 
      "Property1": "10" 
     }, 
    "ChildObject1": 
     { 
      "Property2":"20" 
     } 
} 

しかし、デフォルトの動作は、このような文字列を作成します。

{ 
    "ChildObject1": 
      { 
      "Property1": "10", 
      "Property2": "null" 
      }, 
    "ChildObject2": 
      { 
      "Property1": "null, 
      "Property2":"20" 
      } 
} 

私がNullValueHandlingについて知っています、それは私の場合には正しく働いていません!親オブジェクト(直列化しているオブジェクト)のnullプロパティだけを無視しますが、この親オブジェクトにいくつかの子がある場合、この子オブジェクトのnullプロパティは無視されません。私の状況は異なります。

子オブジェクトの1つのプロパティーもnullでない場合は、1つのnull以外のプロパティーとnullの文字列にシリアル化します。私のコードの


UPD例:

私が入れ子になったクラス

私のオブジェクトは、このようなものです:

public class SendedMessage 
{ 
    public List<Answer> Answers { get; set; } 
    public AnswerItem Etalon {get; set;} 
} 

public class Answer() 
{ 
public AnswerItem Item { get; set; } 
} 

    public class AnswerItem() 
    { 
    public string ID { get; set; } 
    public bool Result { get; set; } 
    public int Number { get; set; } 
    } 

は、私はこのようなSendedMessageオブジェクトをinstatiate:

new SendedMessage x; 
x.Etalon = new AnswerItem(); 
x.Etalon.Result = true; 

私は

string ignored = JsonConvert.SerializeObject(x, 
      Formatting.Indented, 
      new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 

使用して、それは、この文字列を作るより:

{ "エタロン":{ "ID" = "ヌル"、 "結果" = "false" を、数」= "ヌル"} }

本当にnullオブジェクトAnswers(List)は無視されますが、子オブジェクトのnullプロパティは無視されません。

ありがとうございました!

+1

可能性のある重複した[nullの場合json.netを使用して、クラス内のプロパティを無視する方法](のhttp:// stackoverflowの.com/questions/6507889/how-to-ignore-a-property-in-null-use-json-net) – JeetDaloneboy

+0

これを参照してください:http:// stackoverflow。com/questions/33027409/json-net-serialize-jobject-null-propertiesを無視している間 – JeetDaloneboy

+0

まあ、別の状況です。 NullvalueHandling.Ignore **直列化されたオブジェクトの子オブジェクト**のnullプロパティを無視しません。 – Rodoleia

答えて

3

使用この:ここ

string ignored = sonConvert.SerializeObject(movie, 
     Formatting.Indented, 
     new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 

は一例です:の

public class Movie 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Classification { get; set; } 
    public string Studio { get; set; } 
    public DateTime? ReleaseDate { get; set; } 
    public List<string> ReleaseCountries { get; set; } 
} 

static void Main(string[] args) 
{ 
    Movie movie = new Movie(); 
    movie.Name = "Bad Boys III"; 
    movie.Description = "It's no Bad Boys"; 

    string included = JsonConvert.SerializeObject(movie, 
     Formatting.Indented,new JsonSerializerSettings { }); 

      // { 
      // "Name": "Bad Boys III", 
      // "Description": "It's no Bad Boys", 
      // "Classification": null, 
      // "Studio": null, 
      // "ReleaseDate": null, 
      // "ReleaseCountries": null 
      // } 

      string ignored = JsonConvert.SerializeObject(movie, 
       Formatting.Indented, 
       new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 

      // { 
      // "Name": "Bad Boys III", 
      // "Description": "It's no Bad Boys" 
      // } 
     } 
+0

あなたはまた、あなたが望むプロパティにデータ属性を入れることができます(無視する) –

+0

@JeetDaloneboy、私は今この方法を使用しています、そして、私はこの質問に答えてくれました。 NullValueHandling.Ignoreは、完全にnullの子オブジェクトのみを無視します。もし私が直列化しているオブジェクト内に子オブジェクトを持っていて、その子が10個のプロパティを持ち、それらのプロパティのうちの1つだけがnullでない場合は、9ヌルと意味のあるプロパティを持つ文字列になります。 jsonがネストされたヌルプロパティを無視するようにします。 – Rodoleia

+0

あなたのコードを共有できますか? – JeetDaloneboy

関連する問題