在 JSON 反序列化期间将 int 转换为 bool

tob*_*.at 5 c# serialization json poco servicestack

我收到了一个带有 RestSharp 的 JSON 对象。为此,我编写了一个自定义反序列化器,它实现了 ServiceStack.Text:

public T Deserialize<T>(IRestResponse response)
{
  return JsonSerializer.DeserializeFromString<T>(response.Content);
}
Run Code Online (Sandbox Code Playgroud)

响应被映射到一个 POCO,它System.Runtime.Serialization用来提供更好的映射。这工作正常,但不适用于布尔值。返回的属性很多,都是 1 或 0(整数)。

例如: { favorite: 1 }

这里的问题是,我不知道如何在我的 POCO 中将其转换为布尔值。
这不起作用(肯定):

[DataContract]
public class Item
{
  [DataMember(Name = "favorite")]
  public bool IsFavorite { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

关于如何让它工作的任何建议?

我不仅想知道 int <=> bool 的这一点,还想知道所有类型的转换。

myt*_*thz 5

编辑:

我刚刚致力于支持内置支持了这一点,所以在ServiceStack.Text的下一个版本(v3.9.55 +),你可以反序列化01truefalse为布尔值,例如:

var dto1 = "{\"favorite\":1}".FromJson<Item>();
Assert.That(dto1.IsFavorite, Is.True);

var dto0 = "{\"favorite\":0}".FromJson<Item>();
Assert.That(dto0.IsFavorite, Is.False);

var dtoTrue = "{\"favorite\":true}".FromJson<Item>();
Assert.That(dtoTrue.IsFavorite, Is.True);

var dtoFalse = "{\"favorite\":false}".FromJson<Item>();
Assert.That(dtoFalse.IsFavorite, Is.False);
Run Code Online (Sandbox Code Playgroud)

你可以做你想做的:

JsConfig<bool>.DeSerializeFn = x => x.Length == 1 ? x == "1" : bool.Parse(x);
Run Code Online (Sandbox Code Playgroud)

所有ServiceStack.Text 的自定义都在JsConfig可用

其他可用的钩子包括JsConfig<T>.RawSerializeFnJsConfig<T>.RawDeserializeFn,它允许您覆盖自定义 POCO 的自定义序列化。

如果你只是想一些前/后处理有也JsConfig<T>.OnSerializingFnJsConfig<T>.OnDeserializedFn定制挂钩。

这是使用自定义 MyBool struct使用定义反序列化的早期示例。

有关上述自定义挂钩的示例,请参阅ServiceStack.Text 单元测试