web-dev-qa-db-ja.com

ASP.NETコアモデルバインディングのJSON内のNULLと非存在データを区別する方法

ASP.NETコアのアクションでこれら2つのJSON入力を区別します。

{
  "field1": null,
  "field2": null
}
 _

{
  "field1": null,
}
 _

私はc#でこのような普通のクラスを持っています:

public class MyData
{
   public string Field1 { get; set;}
   public string Field2 { get; set;}
}
 _

値としてnullを受け入れることができるオブジェクトの部分的な更新を実行したいが、フィールドが入力に含まれない場合は、このフィールドをまったく更新したくない場合(nullに設定することが他のもの) 。

12

イントロ: ASP.NET COREはあなたの要求本文を取り出してからMyDataとTypeのオブジェクトに逆シリアル化してから、オブジェクトをパラメータとして渡してコントローラ内のメソッドを呼び出します。 Object MyDataから、フィールド2がNULLまたは渡されなかったかどうかわかりません。プロパティの両方の方法ではNULL値があります。あなたが見つけようとしている情報は、逆シリアル化で失われます。

解決策:これを見つけるには、要求本文を読む必要があり、フィールドが渡されたかどうかを確認する必要があります。 ASP.NETコアでは、(MyDataのオブジェクトを作成するためのASP.NETコアフレームワークによって)リクエスト本文を読み取ることがあります。リクエストストリームを巻き戻してから、読み込んでください。そのコードは以下の通りです。

[HttpPost]
public void Post([FromBody] MyData myData)
{
    HttpContext.Request.Body.Seek(0, System.IO.SeekOrigin.Begin);
    System.IO.StreamReader sr = new System.IO.StreamReader(HttpContext.Request.Body);
    var requestBody = sr.ReadToEnd();
    //Now check the requestBody if the field was passed using JSON parsing or string manipulation
    Console.WriteLine(requestBody);
}
 _

警告:これは機能しますが。あなたがしようとしていることは、読みやすさを減らし、他の開発者にとってそれを困難にするでしょう。フィールド値がNULLの場合、または要求本文に存在しなかった場合は区別しています。

ローキーは次のようになります。

public class MyData
{
  public string Field1 { get; set; }
  public string Field2 { get; set; }

  // this can be extension method also.
  public bool HasProperty(string propertyName)
  {
    return GetType().GetProperty(propertyName) != null;
  }
}
 _

メインで:

  string json = "{  \"field1\": null,  \"field2\": null }";
  MyData jsonObject = null;

  jsonObject = JsonConvert.DeserializeObject<MyData>(json);

  MyData source= null; // this will contain values  

  if (jsonObject.HasProperty("Field1"))
    source.Field1 = jsonObject.Field1;
 _

参照: プロパティがクラスに存在するかどうかを確認してください

0
Gauravsa