我有一个JSON序列化问题,我希望这里有人可能知道如何解决它。
我正在使用一个使用大量"魔术字符串的旧应用程序"对于状态等,定义为
public const string StatusActive = "active";
public const string StatusRetired = "retired";
在SQL Server数据库表中,我存储了实际的字符串表示。
这没关系 - 但有点乱。所以我决定围绕这些常量创建包装类,以确保只使用有效的字符串等。这看起来像这样:
public class StatusWrapper {
public const string Active = "active";
public const string Retired = "retired";
private readonly string _value;
public string Value
{
get { return _value; }
}
public StatusWrapper(string value)
{
switch (value)
{
case Active:
case Retired:
_value = value;
break;
default:
throw new ArgumentException($"Invalid status:={value}");
}
}
.....
}
这很好用 - 现在我可以将每个状态捕获到StatusWrapper
个实例中,并确保没有无效的"魔术字符串"使用。
但是当谈到JSON序列化包含这些StatusWrapper
类之一的DTO时,我希望只有一个" JSON属性"以
"status":"active"
在我的JSON中 - 但由于它是一个单独的对象实例,我现在得到
"statusWrapper" : { "value":"active" }
JSON是否有任何诀窍将我的StatusWrapper
类序列化为一个JSON属性?
我尝试使用自定义JSON转换器:
public class StatusWrapperSerializer : JsonConverter
{
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
var statusWrapper = value as statusWrapper;
// writer.WriteStartObject();
writer.WritePropertyName("status");
serializer.Serialize(writer, statusWrapper.Value);
// writer.WriteEndObject();
}
....
}
但是当我用这个客户序列化程序装饰我的StatusWrapper
类时,希望只返回一个JSON属性,而是出现错误:
Message =状态属性中的Token PropertyName将导致无效的JSON对象。路径&#39;。
有没有办法让JSON序列化一个&#34;包装器&#34; class成单个JSON属性?如果是这样的话: HOW ?
答案 0 :(得分:3)
您必须在WriteJson方法中只写入值(不是属性名和值)。
尝试:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
var statusWrapper = (StatusWrapper)value;
writer.WriteValue(statusWrapper.Value);
}