Visual Studioの自動生成REST Webアプリケーションプロジェクト構造を使用して、JSON入力を消費するRESTful APIを作成しています。C#でJSON配列からカスタムクラスにオブジェクトをキャストする
あまり詳細に入るがなければ、私はこれらのようなJSON構造を定義しようとしています
例1:
"operation": {
"type": "EXIST",
"args": [
{
"ColumnName": "SomeColumnA",
"Row": 2
}
]
}
例2:
"operation": {
"type": "ADD",
"args": [
{
"type": "ADD",
"args": [
{
"columnName": "SomeColumnB",
"row": 12
},
{
"columnName": "SomeColumnC",
"row": 18
}
]
},
20
]
}
operation
のうちの1つを表し、任意の数の基本データベース操作とそれらの操作の引数私の最初の例では、操作はEXIST
です。値が存在するかどうかを確認するにはデータベースセルをチェックする必要があります。この操作のargs
は、セルをチェックするための列と行の情報を含むオブジェクトです(これをValue
と呼びます)。私の2番目の例では、関数はADD
であり、2つの値を加算して合計を返す必要があります。ここで、引数は20の定数で、ネストされたADD
関数です。それ自体は2つのValues
をとります。したがって、一般にargs
配列は、プリミティブ値、別のネストされたoperation
、または実際の値を読み取るセルを表す値のいずれかをとることができます。ここでの最終目標は、関数、セル値、定数の組み合わせをネストして、Average
またはSum
のような複合関数を作成する一般的な構造を作成することです。私のモデルフォルダに
、私はに私のデータをキャストする次のクラスを持っている:
public class Instruction
{
public Operation[] Operations { get; set; }
}
public class Operation
{
public string Type { get; set; }
public object[] Args { get; set; }
}
public class Value
{
public string ColumnName { get; set; }
public int Row { get; set; }
}
Operation
でArgs
はタイプobject[]
であることに注意してください。
このJSONをPOSTしてWebアプリケーションを呼び出すと、C#はJSONを自動的にModelsフォルダに定義されたオブジェクトに解析します。我々は実施例1を使用言う:
[HttpPost]
public IHttpActionResult Foo(Instruction instruction)
{
foreach(Operation op in instruction.Operations) {
switch (op.Type) {
case "EXIST":
Console.WriteLine("exist"); // works fine
// since we got here, expect Args[0] to be type 'Value'
var value = (Value) op.Args[0]; // InvalidCastException
// logic for EXIST
case "ADD":
// logic for ADD
// ...
}
}
}
それだけで罰金Operation
をキャストだ、と私は正しく出Type
を取得します。私はまた、Args
を孤独な要素を持つobject[]
としています。しかし、それをValue
にキャストしようとすると、正しくキャストすることを拒否します。
私の質問はすべてこの後です:私はここにしようとしているように見えるようにするための最良の方法は何ですか?正しい軌道にいるのですか?もしそうなら、私のエラーは何ですか?私がこれを間違った方向に向けるなら、より良い練習方法は何ですか? Visual Studioのすぐ使えるWebアプリケーションフレームワークを使用しているので、JSONを脱灰する関数にアクセスできないように見えるので、カスタムデシリアライザを構築することはできません。
、なぜ最初にあなたのクラスを定義して開始し、多くのクラスツーJSONプレビューツールのいずれかを使用していませんか?そうすれば、デシリアライゼーション中に問題が発生することはありません。XMLと同じですが、私は怠惰で常にクラスを最初に作成します – MickyD
どのJSON配列をキャストしたいのですか?Example1はExample2とは異なります –
Argを 'public Value [] Args {get; set; } '?また、C#で動的な型を調べます。あなたのOperationモデルのArgを 'public dynamic Args {get; set;}'として定義することができます。そこから、別のモデルを必要とせずに 'Args [0] .row 'を使うことができます。 – garethb