【问题标题】:Identify single member to serialize for entire class in Json.NET在 Json.NET 中识别要序列化整个类的单个成员
【发布时间】:2019-09-12 22:31:51
【问题描述】:

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

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

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.net serialization json.net


    【解决方案1】:

    您将需要使用自定义 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 或使用反射在转换器中获取其值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多