5

我收到一个带有 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 的这一点,而且还想知道所有类型的转换。

4

1 回答 1

5

编辑:

我刚刚提交了对此的支持内置支持,因此在下一个版本的 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);

JsConfig上提供了所有ServiceStack.Text 的自定义。

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

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

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

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

于 2013-06-25T19:13:46.120 回答