web-dev-qa-db-ja.com

JSON.NetのJObjectをTにキャストする方法

JsonConvert.DeserializeObject<T>(string)を使用できることはわかっていますが、キャスト先の特定のクラスを決定するには、オブジェクトの_type(最初のパラメーターではない可能性があります)を確認する必要があります。基本的に、私がやりたいことは次のようなものです。

//Generic JSON processor for an API Client.
function MyBaseType ProcessJson(string jsonText)
{
  var obj = JObject.Parse(jsonText);
  switch (obj.Property("_type").Value.ToString()) {
    case "sometype":
      return obj.RootValue<MyConcreteType>();
      //NOTE: this doesn't work... 
      // return obj.Root.Value<MyConcreteType>();
    ...
  }
}
...

// my usage...
var obj = ProcessJson(jsonText);
var instance = obj as MyConcreteType;
if (instance == null) throw new MyBaseError(obj);
21
Tracker1

まず、JSONをJObjectに解析します。次に、LINQ toJSONを使用して_type属性を検索します。次に、値に応じて切り替え、ToObject<T>を使用してキャストします。

var o = JObject.Parse(text);
var jsonType = (String)o["_type"];

switch(jsonType) {
    case "something": return o.ToObject<Type>();
    ...
}
38
yamen

JSON.NETには、両方の要件をサポートする直接的な機能はありません。

  • タイプ名を保持するプロパティのカスタム名
  • オブジェクト内の任意の場所でプロパティを探します

最初の必要条件は JsonSubTypes によって満たされます。2番目の必要条件は右を指定することによって MetadataPropertyHandling

0
JotaBe