c#JavaScriptConverter-如何反序列化自定义属性?

c#JavaScriptConverter-如何反序列化自定义属性?,c#,javascript,json,serialization,C#,Javascript,Json,Serialization,我有一个已序列化为JSON的类,我正试图将其反序列化为一个对象 e、 g 简单属性(CssClass)将反序列化为: var contentItemViewModels = ser.Deserialize<ContentItemViewModel>(contentItems); var contentItemViewModels=ser.反序列化(contentItems); 但是PropertyB得到一个错误 我们添加了一个JavaScriptConverter: ser

我有一个已序列化为JSON的类,我正试图将其反序列化为一个对象

e、 g

简单属性(CssClass)将反序列化为:

 var contentItemViewModels = ser.Deserialize<ContentItemViewModel>(contentItems);
var contentItemViewModels=ser.反序列化(contentItems);
但是PropertyB得到一个错误

我们添加了一个JavaScriptConverter:

  ser.RegisterConverters(new List<JavaScriptConverter>{ publishedStatusResolver});
ser.RegisterConverter(新列表{publishedStatusResolver});
但是,当我们将“MyCustomClass”添加为“SupportedType”时,从未调用反序列化方法。但是,当我们将ContentItemViewModel作为SupportedType时,就会调用反序列化

我们有一个当前的解决方案,如下所示:

class ContentItemViewModelConverter : JavaScriptConverter
{

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        var cssClass =  GetString(dictionary, "cssClass"); //I'm ommitting the GetString method in this example...           
        var propertyB= GetString(dictionary, "propertyB");

        return new ContentItemViewModel{    CssClass = cssClass , 
                                            PropertyB = new MyCustomClass(propertyB)}
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new Exception("Only does the Deserialize");
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new List<Type>
                {
                    typeof(ContentItemViewModel)
                };
        }
    }
}
类ContentItemViewModelConverter:JavaScriptConverter
{
公共重写对象反序列化(IDictionary dictionary、类型、JavaScriptSerializer序列化程序)
{
var cssClass=GetString(dictionary,“cssClass”);//我在本例中使用GetString方法。。。
var-propertyB=GetString(字典,“propertyB”);
返回新的ContentItemViewModel{CssClass=CssClass,
PropertyB=新的MyCustomClass(PropertyB)}
}
公共重写IDictionary序列化(对象obj、JavaScriptSerializer序列化程序)
{
抛出新异常(“仅进行反序列化”);
}
公共覆盖IEnumerable SupportedTypes
{
得到
{
返回新列表
{
类型(ContentItemViewModel)
};
}
}
}
但我们更喜欢一个简单的解决方案,只反序列化MyCustomClass,因为ViewModel上还有许多其他字段,每次更改/添加属性时都要编辑此转换器似乎是一种浪费

有没有一种方法可以反序列化MyCustomClass类型的PropertyB


谢谢你的帮助

您考虑过使用


如果MyCustomClass有派生,请将所有可能的类添加到DatacontractJsonSerializer.KnownTypes中。

您考虑过使用


如果MyCustomClass有派生项,则将所有可能的类添加到DatacontractJsonSerializer.KnownTypes中。

,无论花了多少时间,但是我也遇到了同样的问题,解决办法是,反序列化程序没有关于你正在反序列化的类的线索,除非你给他必要的信息

在顶层,它通过反序列化()的类型参数知道类型。这就是为什么
ContentItemViewModel
的转换器可以工作的原因。对于嵌套对象,它需要_类型属性和JavaScriptTypeResolver

var ser = new JavaScriptSerializer(new SimpleTypeResolver());
ser.RegisterConverters(myconverters);
MyClass myObject = new MyClass();
string json = ser.Serialize(myObject);
    // set a breakpoint here to see what has happened
ser.Deserialize<MyClass>(json);
var ser=new JavaScriptSerializer(new SimpleTypeResolver());
服务注册转换器(MyConverter);
MyClass myObject=新的MyClass();
字符串json=ser.Serialize(myObject);
//在此处设置断点以查看发生了什么
序列反序列化(json);
TypeResolver向每个序列化对象添加一个uu类型属性。您可以编写使用短名称的自定义类型解析器。在这个示例中,我使用.net中的SimpleTypeSolver,“简单地”将完全限定的类型名存储为uu类型。反序列化时,JavaScriptDeserializer会查找_类型并向TypeResolver请求正确的类型。然后它知道一个类型并可以调用已注册的JavaScriptConverter.Deserialize方法

如果没有TypeResolver,对象将反序列化到字典,因为JavaScriptSerializer没有任何类型信息

如果您不能在json字符串中提供_类型属性,我认为您需要首先反序列化到Dictionary,然后添加一个“猜测步骤”,解释字段以找到正确的类型。然后,您可以使用JavaScriptSerializer的ConvertToType方法将字典复制到对象的字段和属性中

如果您需要使用ASP.NET提供的JavaScript序列化程序而不能创建自己的JavaCurrSerialServer,请从JavaCurrPixSerialServer的.cTor帮助中考虑此部分:

异步通信层用于从客户端脚本调用Web服务的JavaScriptSerializer实例使用特殊类型的解析器。此类型解析器将可反序列化的类型限制为Web服务的方法签名中定义的类型,或应用GenerateScriptTypeAttribute的类型。不能以编程方式修改此内置类型解析器。
也许GenerateScriptType属性可以帮助您。但是我不知道这里需要什么类型的_类型属性。

经过这么长时间后,不管它值多少钱,但我还是遇到了同样的问题,解决方案是,反序列化程序没有关于你要反序列化的类的线索,除非你给他必要的信息

在顶层,它通过反序列化()的类型参数知道类型。这就是为什么
ContentItemViewModel
的转换器可以工作的原因。对于嵌套对象,它需要_类型属性和JavaScriptTypeResolver

var ser = new JavaScriptSerializer(new SimpleTypeResolver());
ser.RegisterConverters(myconverters);
MyClass myObject = new MyClass();
string json = ser.Serialize(myObject);
    // set a breakpoint here to see what has happened
ser.Deserialize<MyClass>(json);
var ser=new JavaScriptSerializer(new SimpleTypeResolver());
服务注册转换器(MyConverter);
MyClass myObject=新的MyClass();
字符串json=ser.Serialize(myObject);
//在此处设置断点以查看发生了什么
序列反序列化(json);
TypeResolver向每个序列化对象添加一个uu类型属性。您可以编写使用短名称的自定义类型解析器。在这个示例中,我使用.net中的SimpleTypeSolver,“简单地”将完全限定的类型名存储为uu类型。反序列化时,JavaScriptDeserializer会查找_类型并向TypeResolver请求正确的类型。然后它知道一个类型并可以调用已注册的JavaScriptConverter.Deserialize方法

如果没有TypeResolver,对象将反序列化到字典,因为JavaScriptSerializer没有任何类型信息

如果你不能提供
var ser = new JavaScriptSerializer(new SimpleTypeResolver());
ser.RegisterConverters(myconverters);
MyClass myObject = new MyClass();
string json = ser.Serialize(myObject);
    // set a breakpoint here to see what has happened
ser.Deserialize<MyClass>(json);