私は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をキーと値のペアの辞書に変換するためです。
をこれはうまくいくでしょう。あなたのテンプレートエンジンは、逆シリアル化されたオブジェクトのフィールドにアクセスするためにリフレクションを使用していますか?これはあなたが書いているテンプレートエンジンなのでしょうか? –
はい、テンプレートエンジンはリフレクションを使用してすべてのプロパティを検索します。次に、プロパティを反復し、対応するテンプレート項目をプロパティの値で置き換えます。 –