我正在使用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,但适用于所有类型的转换。
答案 0 :(得分:4)
修改强>
我只是committed support built-in support,所以在下一版ServiceStack.Text(v3.9.55 +)中,您可以反序列化0
,1
,true
,false
为布尔值,例如:
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>.RawSerializeFn
和JsConfig<T>.RawDeserializeFn
,可让您覆盖自定义POCO的自定义序列化。
如果您只想进行一些前/后处理,还有JsConfig<T>.OnSerializingFn
和JsConfig<T>.OnDeserializedFn
自定义挂钩。
以下是使用custom MyBool struct自定义反序列化的早期示例。
有关上述自定义挂钩的示例,请参阅ServiceStack.Text unit tests。