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



