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

时间:2013-06-25 18:29:49

标签: c# json serialization servicestack poco

我正在使用RestSharp接收JSON对象。 因此,我编写了一个自定义反序列化器,它实现了ServiceStack.Text:

public T Deserialize<T>(IRestResponse response)
{
  return JsonSerializer.DeserializeFromString<T>(response.Content);
}

响应映射到POCO,POCO使用System.Runtime.Serialization来提供更好的映射。 这工作正常,但不适合布尔人。 返回了很多属性,分别为1或0(整数)。

例如:{ favorite: 1 }

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

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

有关如何使其正常工作的任何建议吗?

我不仅想知道这对于int&lt; =&gt; bool,但适用于所有类型的转换。

1 个答案:

答案 0 :(得分:4)

修改

我只是committed support built-in support,所以在下一版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);

你可以做你想做的事:

JsConfig<bool>.DeSerializeFn = x => x.Length == 1 ? x == "1" : bool.Parse(x);

ServiceStack.Text's上提供了所有JsConfig个自定义设置。

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

如果您只想进行一些前/后处理,还有JsConfig<T>.OnSerializingFnJsConfig<T>.OnDeserializedFn自定义挂钩。

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

有关上述自定义挂钩的示例,请参阅ServiceStack.Text unit tests