【问题标题】:Web API Json Serialization Exception & Dynamic EntitiesWeb API Json 序列化异常和动态实体
【发布时间】:2014-11-10 21:24:20
【问题描述】:

我有一个 Web API 控制器方法,它返回一个对象,该对象给客户端一个 500 内部服务器错误。在服务器上,输出窗口显示“Newtonsoft.Json.JsonSerializationException”。但是我看不出我要返回的课程有什么问题……而且我确信这在历史上一直有效。任何帮助将不胜感激!

编辑:这是 Web API 无法序列化“动态实体”的问题吗?生成类的代码在这里:

        var id = User.Identity.GetUserId();

        var user = db.Users
                    .Where(u => u.Id == id)
                    .Include(u => u.Friends)
                    .FirstOrDefault();

        return user;

我正在返回以下课程;

   public class User : IdentityUser
{
    public User()
    {
        this.Friends = new List<UserFriend>();
    }

    public string PhoneNumber { get; set; }
    public string Email { get; set; }
    public List<UserFriend> Friends { get; set; }
    public bool HasRegistered { get; set; }
    public string LoginProvider { get; set; }
}

“UserFriend”类如下所示;

    public class UserFriend
{
    public int UserFriendId { get; set; }
    public string Id { get; set; }
    public string FriendUserId { get; set; }
    public string FriendUserName { get; set; }
    public string FriendPhoneNumber { get; set; }

}

奇怪的是,当我将鼠标悬停在服务器上返回的对象上时,类型为:{System.Data.Entity.DynamicProxies.User_7283E76A736B4DD47E89120E932CD5C04B62F84C316961F02CDAE3EEF4786504}。我不确定这是什么.. :-O

【问题讨论】:

  • 您能添加完整的异常消息吗?在我看来,您似乎有一个循环引用 User -> UserFriend -> User,类似于 stackoverflow.com/questions/19664257/…
  • 这是我得到的唯一错误文本。而且我已经包含了上面的 UserFriend 类,你可以看到没有循环引用。

标签: json azure windows-phone-8 asp.net-web-api


【解决方案1】:

我使用 AutoMapper 创建 DTO 而不是仅仅返回 User 类。 DynamicProxies 类是因为查询使用了延迟加载,还没有拿到对象。

安装automapper后(Install-Package AutoMapper);

        Mapper.CreateMap<User, UserDto>();
        UserDto dto = Mapper.DynamicMap<UserDto>(user);

然后返回 dto。

【讨论】:

  • 我赞成这个答案,因为我遇到了将具有复杂实体的实体序列化为 JSON 有时会失败的问题,我认为这个工具会有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
相关资源
最近更新 更多