1

このようなオブジェクト構造があるとします

Library 1 ---- 1+ Book 1 ---- 1+ Page

ページ オブジェクトの配列を使用して、本の json オブジェクトをシリアル化したい。

JSON.netシリアライザーを使用すると、循環参照を取得せずにこれをシリアル化できますが、JSONには、ライブラリに関するデータを含む各ページの書籍のすべてのプロパティが含まれています...他の書籍に関するデータを持つことができますこれは大量のノイズです。

この質問 - Serialize Entity Framework objects into JSONの回答から、ジェネリックを実行できることはわかっていますが、これが本当に唯一の方法ですか? これは、大量の余分な作業のように思えます。特に、Json の結果が Book であり、その中にページ オブジェクトの配列がある場合。

私はEntity Framework 4.3.1とJson.net 4.0.30319を使用しています...

4

1 に答える 1

3

シリアル化属性を確認する必要があります。

[JsonObject(MemberSerialization.OptIn)]
public class Page
{
    [JsonProperty]
    public string Text { get; set; }

    // not serialized because mode is opt-in
    public Book Book { get; set; }
}

元の答え

ほとんどの場合、前述の方法が推奨されますが、十分でない場合もあります。

それには2つの方法があります。

JsonConverterを実装し、 WriteJson メソッドをオーバーライドして、必要なプロパティのみを書き込むことができます。

class BookConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Book);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value.GetType() == typeof(T2))
        {
            JObject obj = new JObject();
            Book b = value as Book;
            obj["titre"] = b.Name;
            obj["pages"] = b.Pages;
            // This line can also be 
            // obj.WriteTo(writer, this);
            // if you also need change the way pages are serialized.
            obj.WriteTo(writer, null);
        }
        else
        {
            throw new NotImplementedException();
        }
    }
}

あなたはそのようにそれを呼び出すことができます:

string result = JsonConvert.SerializeObject(
    book,
    new JsonSerializerSettings
    {
        Converters = new JsonConverter[] { new BookConverter() }
    });

JsonBook クラスを作成してシリアル化することもできます。

class JsonBook{
    public JsonBook(Book b){/*...*/}
    public List<Pages> l;
    public string title;
    // No reference to Library.
}
于 2012-11-05T22:46:04.140 に答える