2017-01-06 19 views
1

複雑なJSONオブジェクトを解析するためのベストプラクティスは、この場合コントローラアクションにどのように投稿されますか?C#でネストされた複雑なJSONレスポンスを解析する

モデルクラスを前面に作成すると、送信者が時間の経過とともにJSONの構造を変更するため、脆弱になります。私は個人的にAPIとHTTPメソッドで動作するようにRestSharpを使用

コントローラ

 // POST api/values 
     public void Post([FromBody] AdminNotesModel value) 
     { 

      // do something with JSON... 
     } 

ペイロード例

{ 
"type": "notification_event", 
"app_id": "cl00zu9g", 
"data": { 
"type": "notification_event_data", 
"item": { 
"type": "conversation", 
"id": "7594189485", 
"created_at": 1483576126, 
"updated_at": 1483650387, 
"user": { 
"type": "user", 
"id": "586d933eb76086661e49c991", 
"user_id": "83c3224b-45b2-4f7d-a978-40c836564658", 
"name": "Byrne MichaelaS", 
"email": "[email protected]" 
}, 
"assignee": { 
"type": "admin", 
"id": "848395", 
"name": "Linda", 
"email": "[email protected]" 
}, 
"conversation_message": { 
"type": "conversation_message", 
"id": "69270153", 
"subject": "<p>Summer internship possibilities </p>", 
"body": "<p>Hello,</p><p>My name is Joe Foo. </p><p>Thanks for your time and please let me know if this might be a possibility.</p>", 
"author": { 
"type": "user", 
"id": "586d933eb76086661e49c991" 
}, 
"attachments": [] 
}, 
"conversation_parts": { 
"type": "conversation_part.list", 
"conversation_parts": [ 
{ 
"type": "conversation_part", 
"id": "416288171", 
"part_type": "note", 
"body": "<p>Sent to Vicki</p>", 
"created_at": 1483650387, 
"updated_at": 1483650387, 
"notified_at": 0, 
"assigned_to": null, 
"author": { 
"type": "admin", 
"id": "848395", 
"name": "Linda" 
}, 
"attachments": [], 
"external_id": null 
} 
], 
"total_count": 1 
}, 
"open": true, 
"read": true, 
"metadata": {}, 
"tags": { 
"type": "tag.list", 
"tags": [] 
}, 
"links": { 
"conversation_web": "https://app.intercom.io/a/apps/" 
} 
} 
}, 
"links": {}, 
"id": "notif_d2e41790-d38a-11e6-b063-f9334405d60a", 
"topic": "conversation.admin.noted", 
"delivery_status": "retry", 
"delivery_attempts": 2, 
"delivered_at": 0, 
"first_sent_at": 1483650448, 
"created_at": 1483650387, 
"self": null 
} 
+0

あなたは、パラメータとしてオブジェクトを受け入れることができます。 'ます。public voidポスト([FromBody]オブジェクトobj)' – DomeTune

答えて

1
  1. 最も良い解決策は、エラー検出がはるかに容易になり、処理を簡略化するため、データの事前定義された構造に同意することです。
  2. できない場合は、少なくとも基本的な必須フィールドに同意し、他のすべてを動的に処理することをお勧めします。これを実現するには、public void Post([FromBody] AdminNotesModel value)public void Post([FromBody] String value)に置き換えて、Deserialize json with known and unknown fieldsに記載されているように手動で逆シリアル化を適用する必要があります。私はまた、動的データのためのいくつかの可能なバージョニング/タイピング戦略を検討することをお勧めします。バージョン1と同様に、追加のデータはAdditionalDataVer1クラスですが、バージョン2ではAdditionalDataVer2です。
  3. データの絶対的な動的スキーマを検討している場合は、受け取った文字列値をdynamicまたはless structuredという形式に逆シリアル化する必要があります。
+0

おかげで、提案と説明のために;非常に役立ちます。私はモデルクラスで私の銃に固執するつもりです – Slinky

0

。どうぞご覧ください:http://restsharp.org/。それは非常に便利かもしれません。

+0

おかげで、ジョン{ は\\あなたがobj て欲しい、これまで何}。私は確かに見てみる – Slinky

関連する問題