42

Microsoft JSON シリアライザーと JSON.NET の両方を使用する MVC3 プロジェクトで状況が発生しています。

Microsoft のシリアライザーでは DateTime が基本的に壊れていることは誰もが知っているので、この問題を回避するために JSON.NET に切り替えました。シリアル化しようとしているクラスの一部が DataContract/DataMember 属性を持つ POCO であることを除いて、これはうまく機能します。それらは、複数の場所で参照されるアセンブリで定義されます。さらに、効率のために DataMembers としてマークされていない他の表示プロパティがいくつかあります。たとえば、顧客

[DataContract]
public class Customer
{
   [DataMember]
   public string FirstName { get; set;}
   [DataMember]
   public string LastName { get; set;}
   public string FullName 
   {
       get
       {  return FirstName + " " + LastName; }
   }

}

この顧客が WCF を介して渡されると、クライアント側はそのアセンブリを参照して FullName を問題なく使用できますが、JSON.NET でシリアル化すると、FullName が ではないことがわかり、シリアル化[DataMember]されません。[DataContract]クラスに属性が適用されているという事実を無視するようにJSON.NETに渡すオプションはありますか?

注: .NET で JavaScriptSerializer を使用すると、FullName プロパティに対しては正常に機能しますが、DateTimes は壊れています。このクラスに DataContract/DataMember 属性があるという事実を無視し、それらが存在しない場合と同様に、標準のパブリック フィールドのシリアル化を実行するには、JSON.NET が必要です。

4

6 に答える 6

37

Json.Net の OptOut 属性を使用するだけです。DataContract よりも優先されます。

[DataContract]
[JsonObject(MemberSerialization.OptOut)]
于 2014-05-11T12:29:48.187 に答える
22

Amry が言ったように、独自の IContractResolver を使用できます。

残念ながら、Amry によって提供されたソリューションは私にとってはうまくいきませんでした。

public class AllPropertiesResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        //property.HasMemberAttribute = true;
        property.Ignored = false;

        //property.ShouldSerialize = instance =>
        //{
        //    return true;
        //};

        return property;
    }
}

コメントされた行がいくつかありますが、これらは私のソリューションを機能させるために必要ではありませんが、決してわかりません!

これは Amry のソリューションと同じ使い方です。

var json = JsonConvert.SerializeObject(result, new JsonSerializerSettings {
    ContractResolver = new AllPropertiesResolver()
});

お役に立てれば!

于 2014-02-17T18:02:10.600 に答える
14

私はあなたが抱えている問題にほぼ関連する問題を抱えていましたが、Json.NET のコードを調べて解決策を見つけることができました。したがって、それは最善の解決策ではないかもしれませんが、私にとってはうまくいきます。

これを行うには、独自の を実装する必要がありますIContractResolver。すべてのパラメーターを含め、すべての属性を無視するという過度に単純化された実装 (それだけでDataContractなく、他の組み込みの Json.NET のルールも同様に無視されるため、元々メンバーの選択に影響を与えるはずのオプションを設定すると、このコードによって上書きされます) :

class AllPropertiesResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        return objectType.GetProperties()
            .Where(p => p.GetIndexParameters().Length == 0)
            .Cast<MemberInfo>()
            .ToList();
    }
}

コードの使用例は次のとおりです。

var json = JsonConvert.SerializeObject(result, new JsonSerializerSettings {
    ContractResolver = new AllPropertiesResolver()
});
于 2012-07-28T03:09:32.480 に答える
9

[DataMember]プロパティに Json.NET 固有の属性 ( など[JsonProperty]) の注釈も付けられている場合、Json.NET ドキュメントの属性は無視されます。詳細については、シリアライゼーション属性のドキュメントを参照してください。

Json.NET 属性は、標準の .NET シリアル化属性より優先されます。たとえば、JsonPropertyAttribute と DataMemberAttribute の両方がプロパティに存在し、両方が名前をカスタマイズする場合、JsonPropertyAttribute の名前が使用されます。

ドキュメントは name プロパティのみをカバーしていますが、私の経験では、[JsonProperty]属性は属性によって行われた設定も完全に隠してい[DataMember]ます。そのため、可能であれば、 [DataMember] アノテーションを無視するプロパティに Json.NET 属性も追加してください。

于 2014-04-08T09:17:45.797 に答える
-3

これを試しましたか?

IgnoreDataMemberAttribute

于 2012-06-15T17:20:48.440 に答える