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

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

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

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

例如:{favorite:1}

这里的问题是,我不知道如何将它转换为我的POCO中的布尔值.

这不会起作用(肯定):

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

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

我不仅想知道这对于int< => bool,但对于所有类型的转换一般.

解决方法:

编辑:

我只需要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.

上一篇:c# – 如何使用DataAnnotation将对象序列化为JSON,以使用ServiceStack请求格式化double属性


下一篇:c# – ServiceStack Json反序列化错误