标记要序列化的内部属性[JsonProperty] http://james.newtonking.com/json/help/index.html?topic=html/T_Newtonsoft_Json_JsonPropertyAttribute.htm属性:
public class Foo
{
[JsonProperty]
internal int num1 { get; set; }
[JsonProperty]
internal double num2 { get; set; }
public string Description { get; set; }
public override string ToString()
{
if (!string.IsNullOrEmpty(Description))
return Description;
return base.ToString();
}
}
然后,再进行测试:
Foo f = new Foo();
f.Description = "Foo Example";
f.num1 = 101;
f.num2 = 202;
JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
var jsonOutput = JsonConvert.SerializeObject(f, Formatting.Indented, settings);
Console.WriteLine(jsonOutput);
我得到以下输出:
{
"$type": "Tile.JsonInternalPropertySerialization.Foo, Tile",
"num1": 101,
"num2": 202.0,
"Description": "Foo Example"
}
(其中“Tile.JsonInternalPropertySerialization”和“Tile”是我正在使用的命名空间和程序集名称)。
作为旁白,当使用TypeNameHandling
,请注意这一警告牛顿软件文档 https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm:
当您的应用程序从外部源反序列化 JSON 时,应谨慎使用 TypeNameHandling。当使用 None 以外的值进行反序列化时,应使用自定义 SerializationBinder 验证传入类型。
有关为什么这可能是必要的讨论,请参阅Newtonsoft Json 中的 TypeName 处理谨慎 https://stackoverflow.com/q/39565954/3744182和和由于 Json.Net TypeNameHandling auto ,外部 json 容易受到攻击? https://stackoverflow.com/q/49038055/3744182.