1

假设我有一个像这样的对象结构

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

我想用一组页面对象序列化一本书的 json 对象。

使用 JSON.net 序列化程序,我可以在不获取循环引用的情况下对其进行序列化,但 JSON 仍然在每一页中包含该书的所有属性,其中包括有关图书馆的数据……可以在其他书中包含数据这是一大堆噪音。

从这个问题的答案 - Serialize Entity Framework objects into JSON,我知道我可以做泛型,但这真的是唯一的方法吗?这似乎是大量的额外工作。特别是如果 Json 结果是 Book 和其中的页面对象数组。

我正在使用实体框架 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; }
}

原始答案

在大多数情况下应该首选上述方式,但有些情况还不够。

有两种方法可以做到这一点。

您可以实现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 回答