Vag*_*lov 23 c# serialization json tostring json.net
我使用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类的序列化器,我希望有一个可以适用于任何classe(通过属性我猜).
Bri*_*ers 46
您可以使用自定义轻松完成此操作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
如果不打算大规模使用,有一种更快的方法,在下面的示例中,它是为RecordType属性完成的
[JsonIgnore]
public RecordType RecType { get; set; }
[JsonProperty(PropertyName = "RecordType")]
private string RecordTypeString => RecType.ToString();
| 归档时间: | 
 | 
| 查看次数: | 14727 次 | 
| 最近记录: |