gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:49 24 4
gpt4 key购买 nike

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

例如

public class ContentItemViewModel
{
public string CssClass { get; set; }
public MyCustomClass PropertyB { get; set; }
}

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

 var contentItemViewModels = ser.Deserialize<ContentItemViewModel>(contentItems);

但是 PropertyB 得到一个错误...

我们添加了一个 JavaScriptConverter:

  ser.RegisterConverters(new List<JavaScriptConverter>{ publishedStatusResolver});

但是当我们将“MyCustomClass”添加为“SupportedType”时,从未调用 Deserialize 方法。但是,当我们将 ContentItemViewModel 作为 SupportedType 时,就会调用 Deserialize。

我们有一个看起来像这样的当前解决方案:

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)
};
}
}
}

但我们更喜欢仅反序列化 MyCustomClass 的更简单的解决方案,因为 ViewModel 上还有许多其他字段,每次我们更改/添加属性时都必须编辑此转换器似乎是一种浪费。 ...

有没有办法反序列化 MyCustomClass 类型的 JUST PropertyB?

感谢您的帮助!

最佳答案

您是否考虑过使用 DatacontractJsonSerializer

[DataContract]
public class MyCustomClass
{
[DataMember]
public string foobar { get; set; }
}

[DataContract]
public class ContentItemViewModel
{
[DataMember]
public string CssClass { get; set; }
[DataMember]
public MyCustomClass PropertyB { get; set; }
}

class Program
{
static void Main(string[] args)
{

ContentItemViewModel model = new ContentItemViewModel();
model.CssClass = "StackOver";
model.PropertyB = new MyCustomClass();
model.PropertyB.foobar = "Flow";

//Create a stream to serialize the object to.
MemoryStream ms = new MemoryStream();

// Serializer the User object to the stream.
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ContentItemViewModel));
ser.WriteObject(ms, model);
byte[] json = ms.ToArray();
ms.Close();
string s= Encoding.UTF8.GetString(json, 0, json.Length);


Console.ReadLine();
}
}

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

关于c# JavaScriptConverter - 如何反序列化自定义属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com