2011-01-06 19 views
1

私はJSON文字列を持っています。私はオブジェクトを作成するために使いたいと思います。私はまだオブジェクトの構造やプロパティについて知らないので、匿名型を使って構造体をコーディングすることはできません。私はこのプロジェクトで.NET 3.5についていないので、まだ新しい.Net 4.0機能にアクセスすることはできません。私の目標は、WebForms、Spark、またはRazorに似たテンプレートエンジンで変換されたオブジェクトを使用して、ドキュメントのテンプレート項目にモデルの値を設定することです。JSONから匿名型オブジェクトを作成する方法はありますか?事前にオブジェクトの構造について知りませんか?

私はDeserializeObjectメソッドを持つJavaScriptSerializerを試しましたが、JSONオブジェクトに似たオブジェクトの代わりにキー/値の辞書を出力します。他のアイデア?

それが助け場合は、ここで私が何をしようとしている表現するユニットテストがあります:

[TestClass] 
    public class when_deserializing_json_to_an_object : given_a_json_serializer_context 
    { 
     private object _expectedSerializedObject; 
     private string _jsonStringToDeserialize; 
     private object _result; 

     protected override void Context() 
     { 
      base.Context(); 

      _expectedSerializedObject = new 
              { 
               Test = "123" 
              }; 

      _jsonStringToDeserialize = "{\"Test\":\"123\"}"; 
     } 

     protected override void BecauseOf() 
     { 
      _result = ObjectConverter.Deserialize(_jsonStringToDeserialize); 
     } 

     [TestMethod] 
     public void it_should_return_the_expected_object() 
     { 
      var modelType = _result.GetType(); 
      var modelProperties = modelType.GetProperties(); 
      var testProperty = modelProperties.SingleOrDefault(x => x.Name == "Test"); 

      testProperty.GetValue(_result, null).ShouldEqual("123");    
     } 
    } 

public abstract class given_a_json_serializer_context : SpecificationBase 
    { 
     protected IObjectConverter ObjectConverter; 
     private JavaScriptSerializer _javascriptSerializer; 

     protected override void Context() 
     { 
      _javascriptSerializer = new JavaScriptSerializer(); 
      ObjectConverter = new JsonObjectConverter(_javascriptSerializer) as IObjectConverter; 
     } 
    } 

(SpecificationBaseは、私たちのチームはMSTestを中BDDスタイル指定で私たちを助けるために使用するクラスです)

次のように

はこれまでのところ、上記の仕様から生まれた生産コードは次のとおりです。この時点で

public class JsonObjectConverter : IObjectConverter 
{ 
    private readonly JavaScriptSerializer _javascriptSerializer; 

    public JsonObjectConverter(JavaScriptSerializer javascriptSerializer) 
    { 
     _javascriptSerializer = javascriptSerializer; 
    } 

    public object Deserialize(string json) 
    { 
     return _javascriptSerializer.DeserializeObject(json); 
    } 
} 

、それはJavaScriptSerializerはどうするつもりされていないことは明らかですこれはJSONをキーと値のペアの辞書に変換するためです。

+0

をこれはうまくいくでしょう。あなたのテンプレートエンジンは、逆シリアル化されたオブジェクトのフィールドにアクセスするためにリフレクションを使用していますか?これはあなたが書いているテンプレートエンジンなのでしょうか? –

+0

はい、テンプレートエンジンはリフレクションを使用してすべてのプロパティを検索します。次に、プロパティを反復し、対応するテンプレート項目をプロパティの値で置き換えます。 –

答えて

6

このような匿名のタイプは作成できませんが、新しいクラスを作成できます。

匿名の種類は匿名でしかありません。コンパイラはすべての匿名型の実際の型を生成し、実行時に匿名型に関連付けられた実型が存在します。これらの型は実行時に生成されません。

Reflection.Emitまたは類似の(より強力な)ライブラリを使用して、実行時に適切な構造を持つ新しいクラスを生成し、そのクラスをインスタンス化してデータを生成するデシリアライザを作成できます。

-1

あなたは、ヘルプJson.NETのこの見つけるかもしれない:私はどのように理解していない

「Json.NETは、.NETのための人気の高性能JSONフレームワークである」

http://json.codeplex.com/

関連する問題