栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

序列化特定类型时,如何使JSON.Net序列化程序调用ToString()?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

序列化特定类型时,如何使JSON.Net序列化程序调用ToString()?

您可以使用自定义轻松完成此操作

JsonConverter

public class ToStringJsonConverter : JsonConverter{    public override bool CanConvert(Type objectType)    {        return true;    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        writer.Writevalue(value.ToString());    }    public override bool CanRead    {        get { return false; }    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        throw new NotImplementedException();    }}

要使用转换器,请使用以下

[JsonConverter]
属性来修饰需要序列化为字符串的所有类 :

[JsonConverter(typeof(ToStringJsonConverter))]public class Person{    ...}

这是演示如何运行转换器的演示:

class Program{    static void Main(string[] args)    {        Company company = new Company        { CompanyName = "Initrode", Boss = new Person { FirstName = "Head", LastName = "Honcho" }, Employees = new List<Person> {     new Person { FirstName = "Joe", LastName = "Schmoe" },     new Person { FirstName = "John", LastName = "Doe" } }        };        string json = JsonConvert.SerializeObject(company, Formatting.Indented);        Console.WriteLine(json);    }}public class Company{    public string CompanyName { get; set; }    public Person Boss { get; set; }    public List<Person> Employees { get; set; }}[JsonConverter(typeof(ToStringJsonConverter))]public class Person{    public string FirstName { get; set; }    public string LastName { get; set; }    public override string ToString()     {         return string.Format("{0} {1}", FirstName, LastName);     }}

输出:

{  "CompanyName": "Initrode",  "Boss": "Head Honcho",  "Employees": [    "Joe Schmoe",    "John Doe"  ]}

如果还需要能够从字符串转换回对象,则可以

ReadJson
在转换器上实现该方法,以便它寻找
public staticParse(string)
方法并调用它。注意:请确保将转换器的
CanRead
方法更改为返回
true
(或完全删除
CanRead
过载),否则
ReadJson
将永远不会调用它。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){    MethodInfo parse = objectType.GetMethod("Parse", new Type[] { typeof(string) });    if (parse != null && parse.IsStatic && parse.ReturnType == objectType)    {        return parse.Invoke(null, new object[] { (string)reader.Value });    }    throw new JsonException(string.Format(        "The {0} type does not have a public static Parse(string) method that returns a {0}.",         objectType.Name));}

当然,要使上述方法起作用,还需要确保

Parse
在要转换的每个类上实现合适的方法(如果尚不存在)。对于
Person
上面显示的示例类,该方法可能类似于以下内容:

public static Person Parse(string s){    if (string.IsNullOrWhiteSpace(s))        throw new ArgumentException("s cannot be null or empty", "s");    string[] parts = s.Split(new char[] { ' ' }, 2);    Person p = new Person { FirstName = parts[0] };    if (parts.Length > 1)        p.LastName = parts[1];    return p;}

往返演示:https :
//dotnetfiddle.net/fd4EG4



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号