1

私はこのようなJavascriptSerializerカスタムで使用していますJavascriptConverter

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
   SomeObjectModel TheObject = obj as SomeObjectModel;
   Dictionary<string, object> OutputJson = new Dictionary<string, object>();

   OutputJson.Add("SomeKey", SomeObjectModel.SomeProperty);

   return OutputJson;
}

実行時に動的に変更できるようにしたいSomeKeyので、キーの辞書を作成し、この辞書をシリアライザーに渡し、次のようにすることを考えました。

OutputJson.Add(TheJsonDictionary.SomeKey, SomeObjectModel.SomeProperty);

ただし、次のように関数呼び出しにパラメーターを追加すると:

public override IDictionary<string, object> Serialize(Dictionary<string, string> TheJsonDictionary, object obj, JavaScriptSerializer serializer)

コンパイル時にエラー メッセージが表示されます。これで、このエラーが発生する理由がわかりました (抽象メソッドは 2 つのパラメーターで定義されており、3 を渡しています)。キーをエンコードするために辞書を渡すことができるように、これを回避する方法を考えています。

ありがとう。

4

2 に答える 2

4

JavaScriptSerializer唯一の回避策は、をサブクラス化し、メソッドを再実装して、任意の辞書Serializeを受け入れることだと思います。TheJsonDictionary

class CustomJavaScriptSerializer : JavaScriptSerializer
{
    public Dictionary<string, string> TheJsonDictionary { get; private set; }

    public string Serialize(object obj, Dictionary<string, string> TheJsonDictionary = null)
    {
        this.TheJsonDictionary = TheJsonDictionary;
        return base.Serialize(obj);
    }
}

カスタム コンバーターで、シリアライザー オブジェクトをキャストしてCustomJavaScriptSerializer、キーのカスタム辞書を取得できます。

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
    var TheJsonDictionary = (serializer as CustomJavaScriptSerializer).TheJsonDictionary;

    // rest of method
}
于 2013-01-17T07:12:53.027 に答える
1

私が理解したように、これはあなたが必要とするものです:

class Program
{
    static void Main(string[] args)
    {
        var dict = new Dictionary<string, string>();
        //dict.Add("SomeKey", "SomeProperty1");
        dict.Add("SomeKey", "SomeProperty2");
        var myConverter = new MyConverter();
        var serialized = myConverter.Serialize(dict, new SomeObjectModel() { SomeProperty1 = 1, SomeProperty2 = 2 }, new MySerializer());
    }

    class MySerializer : JavaScriptSerializer
    { }

    class MyConverter : JavaScriptConverter
    {
        Dictionary<string, string> _theJsonDictionary;

        public IDictionary<string, object> Serialize(Dictionary<string, string> TheJsonDictionary, object obj, JavaScriptSerializer serializer)
        {
            _theJsonDictionary = TheJsonDictionary;
            return Serialize(obj, serializer);
        }
        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            SomeObjectModel TheObject = obj as SomeObjectModel;
            Dictionary<string, object> OutputJson = new Dictionary<string, object>();
            foreach (var item in _theJsonDictionary.Keys)
            {
                OutputJson.Add(item, TheObject.GetType().GetProperty(_theJsonDictionary[item]).GetValue(TheObject));
            }
            return OutputJson;
        }

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            return new object();
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get { return new[] { typeof(object) }.AsEnumerable(); }
        }
    }

    class SomeObjectModel
    {
        public int SomeProperty1 { get; set; }
        public int SomeProperty2 { get; set; }
    }
}
于 2013-01-16T18:41:22.067 に答える