在 JSON C# 中包含类名作为序列化的一部分

约翰杰克逊

我有一个特定的情况,当类被序列化时,我需要将类名作为属性包含在 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属性,我需要添加一个父级别。如果它不包含此属性,则应继续正常序列化。

如果我需要解释更多,请告诉我。

György Kőszeg

这个用于指定具体类型的解决方案是必须的还是只是您提出的解决方案?

因为 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何仅将Json文件的一部分反序列化为类C#

Django序列化器输出作为JSON对象的一部分

使用JSON.NET将JSON的一部分反序列化为C#中的数据表

C# 如何组合作为列表一部分的多个 JSON 数组?

如何仅反序列化json文档的一部分?

反序列化 JSON,然后将其中的一部分序列化回来

如何在 C# 中解析不完整的 JSON 的一部分

在 C# 中包含双引号作为 Regex 模式的一部分

反序列化JSON对象的一部分并将其序列化回原样,并保留其余属性

如何反序列化包含同一类嵌套的 json 类(Unity C#)?

通过Rest调用在json中传递fk作为DerivedIdentities的一部分

尝试在 Swift 3.0 中访问数组作为 JSON api 的一部分

在dataweave中读取JSON Payload作为CSV文件的一部分

如何打印作为JSON一部分的字符串数组包含其他属性

在C中获取整数的一部分

将json的一部分(当前作为字符串)分配给JavaScript中的变量

KSQL TABLE 或 STREAM 中的字符串字段包含原始 JSON 消息的一部分

如何通过PHP在JSON添加@符号作为对象名的一部分

如何获得JSON的一部分,作为杰克逊使用纯文本

将json插入postgres作为celery任务的一部分

如何转义作为对象加载的 json 的一部分

作为AJAX成功函数的一部分,从API调用发送PHP的JSON响应

筛选包含数组一部分的JSON文件

C/C++ - 按作为结构一部分的值数组进行复制

如何在 XAML 中迭代集合,其中集合是 c# 类中模型的一部分

检查arraylist是否是斐波那契序列C#的一部分

使用NetwonSoft.Json反序列化C#类会留下部分Json字符串作为响应

从 C# 程序集中提取版本作为 Jenkins 管道的一部分

作为C#安装程序向导的一部分安装Matlab MCR