2016-09-16 3 views
2

私はJSONをRESTサービスから逆シリアル化しようとしています。 JSONを構造体にデシリアライズしています。構造体にはパブリックプロパティが含まれています。私は、基本的なstring/intオブジェクトを隠し、各値に正しいオブジェクトを使用したいと考えています。これを行うにあたり、私は元のプロパティを隠していましたが、それにもかかわらず、それらのプロパティを設定する方法を探したかったのです。私はここでrelevant answerが見つかりました。問題は、デシリアライズ時にプライベートプロパティに実際に値が割り当てられないことです。JSON.NETはプライベートプロパティに逆シリアル化されません

その後、自分でContractResolverを作成しようとしました。 CreateProperty(MemberInfo member, MemberSerialization memberSerialization)のコードが見つかりました。

var prop = base.CreateProperty(member, memberSerialization); 
if (!prop.Writable) 
{ 
    var property = member as PropertyInfo; 
    if (property != null) 
    { 
     var hasPrivateSetter = property.GetSetMethod(true) != null; 
     prop.Writable = hasPrivateSetter; 
    } 
} 

return prop; 

これは完全なプライベートプロパティにはまだ割り当てられません。私が見つけられたすべてのソリューションは、これらの2つのソリューションのバリエーションを使用しているので、ここから進める方法はわかりません。私はどのように進めるべきですか?

EDIT:

私は私の問題を展示する小さな例を作成しました。 https://gist.github.com/Herbstein/9ea14e2a4d95dd5aa4430384bfeeedf3

+0

問題を示すために[MVCE](http://stackoverflow.com/help/mcve)を作成してください。現在のところ、あなたのモデルがどのように見えるのか、契約リゾルバをセリアライザに設定するのか、実際にシリアル化を行っているのかなどは表示されていません。 –

+0

@RBすぐにそれをやろうとしています。 – Herbstein

+0

@ RB。私はOPでリンクされている小さな例を作成しています。可能なすべての構成を持つプログラムの出力は、空の行に過ぎません。 – Herbstein

答えて

1

あなたがプロパティ自体がプライベートであることを可能にする必要があり、民間のセッターを処理するのに十分ではありません。私はまた、より一般的なようAutoMapperについては言及しなかった場合、私は怠慢だろう

internal class PrivateResolver : DefaultContractResolver { 
    protected override IList<JsonProperty> CreateProperties(
     Type type, MemberSerialization memberSerialization 
    ) { 
     return type 
      .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic) 
      .Select(p => CreateProperty(p, memberSerialization)) 
      .ToList(); 
    } 

    protected override JsonProperty CreateProperty(
     MemberInfo member, MemberSerialization memberSerialization 
    ) { 
     var prop = base.CreateProperty(member, memberSerialization); 
     if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) { 
      prop.Writable = true; 
     } 
     return prop; 
    } 
} 

このような問題の解決策。そのためには、より多くのクラスを宣言する必要がありますが、型自体もよりシンプルに保ちます。

関連する問題