【问题标题】:ASP.NET WebAPI Creating one-level JSONASP.NET WebAPI 创建一级 JSON
【发布时间】:2015-12-13 17:14:22
【问题描述】:

域组装中有很多相关的实体。例如,People 具有导航属性 (Level1) 到 FamilyRelationsHousesPersons。除此之外,Houses 有自己的 nav.prop (Level2) 到 AddressAddress (Level3) 必须到 City, Street ... 等等。 当我将 LazyLoadingEnabled 设置为 true 时,我将获得包含所有相关实体的 JSON(在屏幕左侧)。

我怎样才能只获得一个嵌套级别(如在 scree 的右侧)或将其他级别设置为 NULL 值(因为我设置了 Newtonsoft.Json.NullValueHandling.Ignore)?
我可以在每个实体不使用.Include 的情况下实现它吗?

我的班级:

    public class People : BaseEntity
    {
        public int PersonID { get; set; }

        public int HouseID { get; set; }

        public int PeopleNumber { get; set; }

        public int? FamilyRelationID { get; set; }            

        //FK to House
        public virtual House Houses { get; set; }
        //FK to Person
        public virtual Person Persons { get; set; }
        //FK to FamilyRelations
        public virtual FamilyRelations FamilyRelations { get; set; }
    }

WebAPI 配置:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new   MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
            = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling
             = Newtonsoft.Json.NullValueHandling.Ignore;

我没有任何解决方案,因为我没有足够的经验。
所以,我需要你的建议,关于它的建议。对不起我的英语,如果我必须添加更多信息,请告诉我。谢谢

更新
我试图在映射类中添加[JsonIgnore] 或忽略这些属性,但是当我请求get/House 时,我需要在没有nav.prop 的情况下从Address 获取字段,而当请求get/People 时,我不需要@ 987654342@。结果我不能忽视它。

【问题讨论】:

标签: c# json asp.net-mvc entity-framework asp.net-web-api


【解决方案1】:

永远不要将被跟踪的对象返回给控制器。您的业​​务逻辑代码(不应存在于控制器中)应将您的数据库感知对象映射到 POCO。这可以像使用

一样简单
var poco = AutoMapper.Map<People>(livePerson)

并且您在映射配置文件中进行设置以忽略这些属性,因此它们不会被复制。

请注意,我的 automapper-fu 生锈了,因为语法是粗略的代码。

您需要非常小心任何盲映射,因为它会为您打开Mass Assignment vulnerability。这同样适用于直接访问您的实时跟踪对象。如果用户在他们的数据中看到 IsAdmin: false,他们可能会变得狡猾并发布 IsAdmin: true。这可以通过盲目分配保存到您的数据库中。

【讨论】:

  • 谢谢。您能否向我解释一下,当我想获得PeopleHouse 时,我应该如何管理需要忽略的属性?当People 时需要忽略AddressHouse 但当House 时我不需要忽略Address。如果不清楚,请见谅
  • 您为每种情况设置不同的地图。
【解决方案2】:

如果您正在寻找一种方法来忽略json 序列化中的导航属性,this answer 可以提供帮助,您可以通过它忽略json 序列化中的导航属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2021-10-10
    • 2017-06-18
    • 2015-10-02
    相关资源
    最近更新 更多