JToken(または文字列)を与えられたTypeに変換する
質問
TL;DRバージョン
型オブジェクトがあります。
JToken
(ただし
string
に含まれるタイプに変換する必要があります。
type
変数に含まれる型に変換する必要があります。
Type type = typeof(DateTime); /* can be any other Type like string, ulong etc */
var obj = jsonObject["date_joined"]; /* contains 2012-08-13T06:01:23Z+05:00 */
var result = Some_Way_To_Convert(type, obj);
上記の
result
で指定された値を持つ DateTime オブジェクトである必要があります。
date_joined
.
全文表示
Windows PhoneプロジェクトでRestSharpとJson.NETの両方を使用していますが、REST APIからJSONレスポンスをデシリアライズしようとして、行き詰っています。
私が実際に達成しようとしていることは、あなたがすでにRestSharpでできるように、JSON応答をCLRエンティティに簡単にマッピングできる汎用メソッドを記述することです。唯一の問題は、デフォルトのRestSharp実装が私のために動作していないことで、それはJSONを正常にパースするのに失敗します。
null
であるフィールドをRESTサーバーから返さない)。
それが、NewtonsoftのJson.NETがより強力なJsonデシリアライズエンジンを持っているので、それを使うことにした理由です。残念ながら、それはRestSharpのようなファジーなプロパティ/フィールド名をサポートしていません(または、私はそれを見つけられませんでした)ので、私が次のようなものを使用するとき、それはまた私のCLRエンティティに正しくマッピングされません。
JsonConvert.DeserializeObject<User>(response.Content)
.
私のJsonはこんな感じです(実際には例です)。
{
"id" : 77239923,
"username" : "UzEE",
"email" : "[email protected]",
"name" : "Uzair Sajid",
"twitter_screen_name" : "UzEE",
"join_date" : "2012-08-13T05:30:23Z05+00",
"timezone" : 5.5,
"access_token" : {
"token" : "nkjanIUI8983nkSj)*#)(kjb@K",
"scope" : [ "read", "write", "bake pies" ],
"expires" : 57723
},
"friends" : [{
"id" : 2347484",
"name" : "Bruce Wayne"
},
{
"id" : 996236,
"name" : "Clark Kent"
}]
}
そして、これが私のCLRエンティティの例です。
class AccessToken
{
public string Token { get; set; }
public int Expires { get; set; }
public string[] Scope { get; set; }
public string Secret { get; set; } /* may not always be returned */
}
class User
{
public ulong Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string Name { get; set; }
public string TwitterScreenName { get; set; }
public DateTime JoinDate { get; set; }
public float Timezone { get; set; }
public bool IsOnline { get; set; } /* another field that might be blank e.g. */
public AccessToken AccessToken { get; set; }
public List<User> Friends { get; set; }
}
私が欲しいのは、上記のJSONを与えられたCLRオブジェクトにパースする簡単な方法です。私はRestSharpのソースコードを見て回り、その中で
JsonDeserializer
のコードを見て、私は一般的な拡張メソッドを書くことができました。
DeserializeResponse<T>
に
JObject
という型のオブジェクトを返すはずです。
T
. 意図した使い方は次のようなものです。
var user = JObject.Parse(response.Content).DeserializeResponse<User>();
上記のメソッドは、与えられたJson ResponseをパースしてUserエンティティオブジェクトを生成します。以下は、実際のコード・スニペットです。
DeserializeResponse<User>
拡張メソッド(RestSharpのコードをベースにしています)で行っている実際のコードスニペットです。
public static T DeserializeResponse<T>(this JObject obj) where T : new()
{
T result = new T();
var props = typeof(T).GetProperties().Where(p => p.CanWrite).ToList();
var objectDictionary = obj as IDictionary<string, JToken>;
foreach (var prop in props)
{
var name = prop.Name.GetNameVariants(CultureInfo.CurrentCulture).FirstOrDefault(n => objectDictionary.ContainsKey(n));
var value = name != null ? obj[name] : null;
if (value == null) continue;
var type = prop.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
type = type.GetGenericArguments()[0];
}
// This is a problem. I need a way to convert JToken value into an object of Type type
prop.SetValue(result, ConvertValue(type, value), null);
}
return result;
}
私は、その変換が些細なタスクであるため、本当に簡単なことであると推測しています。しかし、私は今、かなり長い間探していますが、Json.NET経由でそれを行う方法をまだ見つけていません(そして、正直に言うと、ドキュメントは理解するのが難しく、いくつかの例も欠けています)。
どんな助けでも本当に感謝されます。
どのように解決するのですか?
ToObjectメソッドがあります。
var obj = jsonObject["date_joined"];
var result = obj.ToObject<DateTime>();
また、任意の複合型でも動作し、JsonPropertyAttributeのルールに従います。
var result = obj.ToObject<MyClass>();
public class MyClass
{
[JsonProperty("date_field")]
public DateTime MyDate {get;set;}
}
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 存在しないかもしれないJTokenから価値を得る(ベストプラクティス)