您可以用自定義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
非常感謝。正是我需要的。奇蹟般有效。 –
很高興我能幫到你。 –
@BrianRogers謝謝你的一個奇妙的答案。我想知道是否可以提供有關如何在轉換器中實現ReadJson()的任何見解,以便它將該字符串反序列化爲其兩個相應的屬性? – propagated