asp.net - 识别单个成员以在 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
?
解决方案
您将需要使用自定义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
或使用反射在转换器中获取其值。
推荐阅读
- sql - 用 SELECT 语句的结果填充 BETWEEN
- c# - 如何将datagridview中的列绑定到c#中的数组元素
- python - {ValueError: int() 以 10 为基数的无效文字:} 分组整数时
- gitlab - 为什么 Gitlab 在您批准合并请求时会自动将目标分支合并到源分支?如何禁用此行为?
- javascript - 我很困惑为什么会这样?数字(i)+数字(1);
- ios - iOs:如何在 UITabBarItem 中获得最小比例因子?
- python-3.x - 结束批处理文件交互以禁用 Python 输出重定向
- node.js - socket.io 在路径上带有 nodejs ( http://localhost:3000/path)
- javascript - Chrome webRequest中的URL重定向被阻止的URL
- amazon-web-services - 由于服务角色,无法创建管道