web-dev-qa-db-ja.com

JsonPropertyを無視するJSON.Netシリアライザー?

私は次のエンティティクラスを持っています:

public class FacebookComment : BaseEntity
{
    [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
    [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
    [JsonProperty("_id")]
    public ObjectId Id { get; set; }

    public int? OriginalId { get; set; }
    public DateTime Date { get; set; }
    public string Message { get; set; }
    public string Sentiment { get; set; }
    public string Author { get; set; }
}

このオブジェクトがJSONにシリアル化されるとき、Idフィールドを "_id":{...}として記述したいと思います。 AFAIK、必要なプロパティ名をJsonProperty属性に渡す必要があります。そして、私は行ってもいいはずです。ただし、JsonConvert.SerializeObjectを呼び出すと;私の属性を無視しているようで、代わりにこれをレンダリングします:

{
    Author: "Author name",
    Date: "/Date(1321419600000-0500)/",
    DateCreated: "/Date(1323294923176-0500)/",
    Id: {
        CreationTime: "/Date(0)/",
        Increment: 0,
        Machine: 0,
        Pid: 0,
        Timestamp: 0
    },
    Message: "i like stuff",
    OriginalId: null,
    Sentiment: "Positive"
}

ご覧のとおり、Idフィールドが間違ったフィールド名でレンダリングされています。

何か案は?この問題に1時間取り組んでいます。シリアライザーが私のJsonPropertyを無視しているように見える理由を理解できません。

建設的な意見は大歓迎です。

20
Frank Rosario

IdプロパティをJsonPropertyではなく[System.Runtime.Serialization.DataMember(Name = "_ id")]でマークすることで、この問題を修正しました。なぜそれが元々機能しなかったのかについてはまだ完全には明らかではありません...

2
Frank Rosario

Short Answer:すべてのアセンブリがSAME EXACT JSON.NETDLLを参照していることを確認してください。おそらく何が起こっているのかというと、1つのアセンブリで[JsonProperty]を1つのDLLから適用し、別の[JsonProperty]を探している別のアセンブリからオブジェクトをシリアル化するためです。 CLRオブジェクトタイプは異なり、事実上無視されています。


長い回答:私はこの問題を抱えていましたが、幸いなことに、JsonPropertyで動作するクラスと、検出できないクラスが1つあったためです。

私は非労働者階級を最小限にまで取り除き、それを労働者階級と比較しましたが、非労働者階級が別の議会にあったという事実を除いて、違いは見られませんでした。

クラスを他のアセンブリに移動すると、正常に機能しました。

名前空間のJSONシリアル化を調べようと少し調べましたが、それは当てはまらないようだったので、参照を調べて、古いJSONNET3.5 DLLエンティティ内DLLおよびメインプロジェクトファイル内のNUGET4.5バージョン。

これにより、[JsonProperty]属性の2つのインスタンス(これは単なる通常のクラスです)が得られます。同じ名前が付けられているからといって、シリアライザーが属性を認識しているわけではありません。

20
Simon_Weaver

この投稿は私を助けました。

私はシリアライザーを使用しました:

new JavaScriptSerializer().Serialize(message)

しかし、これを正しく使用してください:

JsonConvert.SerializeObject(message);
5
user5866334