首页 > 解决方案 > 识别单个成员以在 Json.NET 中为整个类序列化

问题描述

我想创建一个将序列化为其成员之一的类。

使用一个在字符串和函数之间切换的辅助类:

using Newtonsoft.Json;

class FunctionOrString {
    object JSONObject { get { return (((object)ValFunction) ?? ValString); } }
    public string ValString { get; set; }
    public Newtonsoft.Json.Linq.JRaw ValFunction { get; set; }
}

class ClassToSerialize {
    [JsonProperty("template")] public FunctionOrString Template { get; set; }
}

我不想输出{ "template": { "JSONObject": "val" } },但是{ "template": "val" }。我需要将哪些属性应用于FunctionOrString类或JSONObject属性,以便Template对象将自身序列化为属性的序列化JSONObject

标签: asp.netserializationjson.net

解决方案


您将需要使用自定义JsonConverter来更改序列化 JSON 的形状。像这样的东西应该可以完成这项工作:

class FunctionOrStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(FunctionOrString);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, ((FunctionOrString)value).JSONObject);
    }

    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(FunctionOrStringConverter))]
class FunctionOrString
{
    ...
}

这是一个工作演示:https ://dotnetfiddle.net/oIkhXg

注意:在您的问题中,该JSONObject属性未标记public。我假设这是一个意外遗漏。如果没有,您将需要制作它internal或使用反射在转换器中获取其值。


推荐阅读