1

我正在使用 C# 的 MVC 4 API 和 Entity Framework 4 以及自动生成的模型和控制器。我有一个正在序列化为 JSON 的父子关系。我的关系被序列化得很好,但我只想显示嵌套子项的 id 而不是整个对象。

这是我目前得到的 JSON 响应。

[{
    "ID": 1,
    "NAME": "PARENT1",
    "CHILDREN": [{
        "ID": "1",
        "NAME": "CHILD1"
    },{
        "ID": "2",
        "NAME": "CHILD2"
    }]
}]

这就是我想要得到的。

[{
    "ID": 1,
    "NAME": "PARENT1",
    "CHILDREN": [1,2]
}]

这些是我正在使用的模型。

public partial class PARENT
{
    public PARENT()
    {
        this.CHILDREN = new List<CHILD>();
    }

    public int ID { get; set; }
    public string NAME { get; set; }
    public virtual ICollection<CHILD> CHILDREN { get; set; }
}

public partial class CHILD
{
    public CHILD(){}

    public int ID { get; set; }
    public string NAME { get; set; }
    public int PARENT_ID { get; set; }
}

我的控制器方法。

// GET api/Parents
public IEnumerable<PARENT> GetPARENTs()
{
    return db.PARENTS.AsEnumerable();
}

任何帮助将不胜感激,因为我不确定我应该寻找什么。我对 EF 和 .NET 的 MVC 还很陌生,这似乎应该很容易做到。

提前非常感谢大家。!:)

4

3 回答 3

0

我认为您只需要一个简单的 LINQ:

IList<PARENT> parents; // I assume you have a list of PARENT fetched from DB

var results = parents.Select(
      p => new 
      { 
          ID = p.ID, NAME = p.NAME, 
          CHILDS = p.CHILDREN.Select(a=>a.ID).ToList() 
      }).ToList();

return Json(results);
于 2013-04-01T10:03:17.220 回答
0

更复杂的方法是使用您自己的使用自定义 xml 序列化的自定义媒体格式化程序。

于 2013-04-01T11:12:31.863 回答
0

作为参考,这是我想出的另一种方法。你们中的大多数人不会赞成使用动态,但因为我想在多个关系中使用它,而不是每次都指定对象的类型,它就像一个魅力。

public class CollectionOfIds : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        IList collection = (IList)value;
        List<int> ids = new List<int>();
        foreach (var item in collection)
        {
            dynamic itemCollection = (dynamic)item;
            ids.Add(itemCollection.ID);
        }
        serializer.Serialize(writer, ids);
    }
}

在我只是这样装饰模型属性之后......

public partial class PARENT
{
    public PARENT()
    {
        this.CHILDREN = new List<CHILD>();
    }

    public int ID { get; set; }
    public string NAME { get; set; }
    [JsonConverter(typeof(CollectionOfIds))]
    public virtual ICollection<CHILD> CHILDREN { get; set; }
}
于 2013-04-02T13:38:50.203 回答