当前位置: 首页 > 面试题库 >

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

邢晗日
2023-03-14
问题内容

我正在使用Newtonsoft.Json序列化程序将C#类转换为JSON。对于某些类,我不需要将序列化器设置为具有单个属性的实例,而只需在对象上调用ToString,即

public class Person
{
   public string FirstName { get; set; }
   public string LastName { get; set; }

   public override string ToString() { return string.Format("{0} {1}", FirstName, LastName ); }
}

我应该怎么做才能使Person对象序列化为其ToString()方法的结果?我可能有许多这样的类,所以我不想以特定于Person类的序列化器结尾,我想拥有一个可以应用于任何类的序列化器(我想通过属性)。


问题答案:

您可以使用自定义轻松完成此操作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 static Parse(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



 类似资料:
  • 本文向大家介绍C#使用Json.Net进行序列化和反序列化及定制化,包括了C#使用Json.Net进行序列化和反序列化及定制化的使用技巧和注意事项,需要的朋友参考一下 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当

  • 问题内容: 我有一堂课 我想将下面的JSON数据反序列化到上面的类/对象中 我的想法是在JSON中是一个对象,但我只想获取(在JSON中)在反序列化期间将像在类中那样传递。 如何使用Json.NET实现该目标? 我相信我可以使用CustomJsonConverter完成它。但是我很困惑。docs中的示例仅用于,但不适用。 问题答案: 我只是使用上面在问题中提到的方法解决了我的问题。在我完整的代码下

  • 问题内容: 是否可以使用Json.NET 序列化为NDJSON(换行分隔的JSON)?Elasticsearch API使用NDJSON进行批量操作,我找不到任何暗示 任何 .NET库都支持此格式的信息。 这个答案提供指导反序列化NDJSON,并有人指出,一个能够独立序列每一行和新行加入,但我不一定会调用 支持 。 问题答案: false`](http://www.newtonsoft.com/j

  • 我需要通过flink消费Kafka,不幸的是,Kafka消息是在serde中使用原型,完全不知道如何处理它,这里是来自互联网的代码,但我不能使它工作。 这不起作用,它会让NPE: 有人知道我做错了什么吗?使用twitter ProtobufSerializer是唯一值得拥有protobuf的方法吗?还是还有别的路要走?

  • 问题内容: 我有以下课程,将其用作字典中的键: 我正在运行的测试在这里: 测试失败,因为Json.Net似乎正在使用字典键上的方法,而不是正确地序列化它们。上面测试得出的json是: 这显然是错误的。我如何使它工作? 问题答案: 这应该可以解决问题: 序列化: 通过调用,您正在序列化一个对象数组而不是字典。 反序列化: 在这里,您可以反序列化数组,然后通过调用检索字典。 我不确定输出是否满足您的期