【问题标题】:Convert int to bool during JSON deserialization在 JSON 反序列化期间将 int 转换为 bool
【发布时间】:2013-06-25 18:29:48
【问题描述】:

我收到一个带有 RestSharp 的 JSON 对象。 为此,我编写了一个自定义的 Deserializer,它实现了 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 的这一点,还想知道所有类型转换的一般情况。

【问题讨论】:

    标签: c# json serialization servicestack poco


    【解决方案1】:

    编辑:

    为此我只使用了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);
    

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

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

    如果您只想进行一些预处理/后处理,还有 JsConfig&lt;T&gt;.OnSerializingFnJsConfig&lt;T&gt;.OnDeserializedFn 自定义挂钩。

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

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

    【讨论】:

    • 嗨黛米斯!我已经构建了新的 SS.TEXT 版本并现在在我的项目中使用它。有用!非常感谢您的承诺!我也试过DeSerializeFn,它也很有魅力!
    • Demis,你读懂了我们的想法。就在今天,我们开始怀疑布尔反序列化是否支持 0/1 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2022-01-11
    • 2012-09-11
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多