gpt4 book ai didi

asp.net-ajax - 控制.NET中自定义类型的JSON序列化格式

转载 作者:行者123 更新时间:2023-12-02 20:40:00 27 4
gpt4 key购买 nike

我有一个 PhoneNumber 类,用于存储规范化字符串,并且我为字符串 <-> Phone 定义了隐式运算符,以简化将 PhoneNumber 作为字符串处理的过程。我还重写了 ToString() 方法,以始终返回数字的清理版本(没有连字符、括号或空格)。在显示号码的任何 View 中,我显式调用phone.Format()。

这里的问题是将具有 PhoneNumber 的实体序列化为 JSON; JavaScriptSerializer 将其序列化为 [object Object]

我想将其序列化为 (555)555-5555 格式的字符串。

我考虑过编写自定义 JavaScriptConverter,但 JavaScriptConverter.Serialize() 方法返回一个名称-值对字典。我希望将 PhoneNumber 视为带有字段的对象,我只想将其序列化为字符串。

最佳答案

值得考虑您想要的 JSON。

假设你有这个类(class)

class Person
{
public string Name { get; set; }
public PhoneNumber HomePhone { get; set; }
}

您希望将其序列化为 JSON,如下所示

{ "Name":"Joe", "HomePhone": "555-555-555" }

但是你得到的是 JSON,类似这样的东西

{ "Name":"Joe","HomePhone": {"Number": "555-555-555"} }

--

要了解为什么会这样,请考虑 PersonNumber 属性是一个对象。 JSON 预计至少有一个 {} 来包装对象 - 或者更重要的是,{} 中包含一组名称/值。

如果您真的非常想要以前的 JSON 语法,您需要为 Person 对象注册一个自定义转换器,以便您可以说服它序列化和反序列化为字符串。 (请参阅下面的代码示例)。

但是,我建议您接受这一点,因为 PhoneNumber 是一个对象,当序列化为 JSON 时,它对应于名称/值字典,并接受 JSON 看起来比您理想情况下不太“干净”想要。

FWIW 这是一个实现您最初目标的代码示例(不是推荐的方法)..

class Person
{
public string Name { get; set; }
public PhoneNumber HomeNumber { get; set; }
}

struct PhoneNumber
{
private string _number;
public PhoneNumber(string number)
{
_number = number;
}

public override string ToString()
{
return _number;
}
}

class PersonConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { yield return typeof(Person); }
}

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
Person person = obj as Person;
if (person != null)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict["Name"] = person.Name;
dict["HomeNumber"] = person.HomeNumber.ToString();
return dict;
}
return new Dictionary<string, object>();
}

public override object Deserialize(IDictionary<string, object> dict, Type type, JavaScriptSerializer serializer)
{
if (dict == null)
throw new ArgumentNullException("dict");

if (type == typeof(Person))
{
// Deserialize the Person's single property.
string name = (string)dict["Name"];
string homeNumber = (string)dict["HomeNumber"];

// Create the instance to deserialize into.
Person person = new Person()
{
Name = name,
HomeNumber = new PhoneNumber(homeNumber)
};
return person;
}
return null;
}
}

class Program
{
static void Main(string[] args)
{
PhoneNumber number = new PhoneNumber("555 555");
Person joe = new Person() { Name = "Joe", HomeNumber = number };

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new PersonConverter() });
Console.Out.WriteLine(serializer.Serialize(joe));
}
}

关于asp.net-ajax - 控制.NET中自定义类型的JSON序列化格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596957/

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