我有一个特定的情况,当类被序列化时,我需要将类名作为属性包含在 JSON 中。棘手的部分是我需要动态执行此操作。我不能在调用序列化之前创建一个匿名类。
我用自定义属性装饰了我的类,如下所示:
[OntologyArea("con", " http://someurl/area/DomicileAddress")]
public class DomicileAddress : IContactPoint
{
[JsonProperty(PropertyName = "con:hasAddressPoint")]
public IAddressPoint AddressPoint
{
get; set;
}
}
在上面的例子中,OntologyArea
属性应该被读取并作为一个属性包含在内。属性名应该是OntologyArea
+ 类名的第一个参数(即 con:DomicileAddress),值应该是 的具体类IAddressPoint
。
棘手的部分是 IAddressPoint 的具体类可能需要执行与此处所示相同的操作:
[OntologyArea("geo", "http://someurl.net/geolocation")]
public class StreetAddress : IAddressPoint
{
[JsonProperty("geo:hasStartingStreetNumber")]
public string StartingStreetNumber
{
get; set;
}
}
JSON 示例:
"con:DomicileAddress" : {
"con:hasAddressPoint" : {
"geo:StreetAddress" : {
"geo:hasEndingStreetNumber" : ""
}
}
}
所以如果任何对象确实有一个OntologyArea
属性,我需要添加一个父级别。如果它不包含此属性,则应继续正常序列化。
如果我需要解释更多,请告诉我。
这个用于指定具体类型的解决方案是必须的还是只是您提出的解决方案?
因为 Json.NET 内置支持对接口类型或基类的属性的实际类型进行编码:
var json = JsonConvert.SerializeObject(myContract, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
如果你真的需要一个完全自定义的逻辑,你必须实现一个转换器,它也可以传递给JsonSerializerSettings
. 它必须派生自,JsonConverter
并且您必须实现WriteJson
使用低级令牌发出所需 json 字符串的方法,就像在以下情况下一样XmlWriter
:
private class MyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IAddressPoint).IsAssignableFrom(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var address = (IAddressPoint)value;
writer.WriteStartObject(); // {
writer.WritePropertyName($"geo:{address.GetType().Name}"); // "geo:StreetAddress"
// ... etc.
writer.WriteEndObject(); // }
// or you can just emit raw string:
writer.WriteRaw(myJsonBody);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
{
// todo: and the deserialization part goes here
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句