5

RestSharp で JSON オブジェクトを受信して​​います。そのため、ServiceStack.Text を実装するカスタム Deserializer を作成しました。

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

応答は POCO にマップされ、System.Runtime.Serializationより適切なマッピングを提供するために使用されます。それはうまくいきますが、ブール値ではありません。1 または 0 (int) の多くのプロパティが返されます。

例えば:{ 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化できます。1truefalse

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 のカスタマイズはすべてJsConfigで利用できます。

利用可能なその他のフックには、カスタム POCO のカスタム シリアル化をオーバーライドできる および が含まれますJsConfig<T>.RawSerializeFnJsConfig<T>.RawDeserializeFn

前/後処理が必要な場合は、JsConfig<T>.OnSerializingFnおよびJsConfig<T>.OnDeserializedFnカスタム フックもあります。

カスタム MyBool structを使用してカスタマイズされた逆シリアル化を使用する前の例を次に示します。

上記のカスタム フックの例については、 ServiceStack.Text 単体テストを参照してください。

于 2013-06-25T19:13:46.120 に答える