Json结果:预期','而不是''

时间:2017-07-03 12:15:27

标签: c# json asp.net-core

对于api和json序列化,我有点新鲜。 我遇到了一个奇怪的输出。我的json输出似乎被截断或格式错误了?

(我正在使用带有.net核心2.0和实体框架核心2.0预览2的web api)

邮递员发生以下错误:

Expected ',' instead of ''

但是在查看原始数据时,我发现并非所有内容都在发送:

 {
    "id": 2,
    "username": "c8bee98",
    "firstname": "Firstname73",
    "lastname": "Lastname73",
    "creationDate": "2017-07-02T23:47:16.204588",
    "activityDate": "2017-07-03T14:02:58.6982234+02:00",
    "profilePictureURL": "ProfilePictureURL73",
    "gender": 2,
    "location": "POINT(25.1400680863951
    -25.0786780636193)",
    "appsetting": null,
    "email": "Email73",
    "isHidden": false,
    "isBanned": false,
    "feedback": [{
            "id": 19,
            "rating": 1,
            "feedbackType": 0,
            "message": "Message1",
            "creationDate": "2017-07-02T23:47:18.2287331",
            "userId": 2

我的控制器看起来像这样:

    UserManager userManager = new UserManager();

    [HttpGet]
    public async Task<User> GetById(int id)
    {
        try
        {
            return await userManager.GetByIdAsync(id);
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

我的模型看起来像这样:

public class User
{
    [DisplayName("Id")]
    public int Id { get; set; }


    private string username = Guid.NewGuid().ToString("N");

    [Required(ErrorMessage = "Username is required")]
    [DisplayName("Username")]
    [StringLength(32)]
    public string Username
    {
        get {
            string shortusername = username;
            return shortusername.Remove(0,25);
        }
    }
    public string ResetUsername()
    {
        username = Guid.NewGuid().ToString("N");
        return username;
    }

    [Required(ErrorMessage = "Firstname is required")]
    [StringLength(50, ErrorMessage = "Firstname can only be 50 characters long")]
    [DisplayName("Firstname")]
    public string Firstname { get; set; }

    [Required(ErrorMessage = "Lastname is required")]
    [StringLength(50, ErrorMessage = "Lastname can only be 50 characters long")]
    [DisplayName("Lastname")]
    public string Lastname { get; set; }

    [Required(ErrorMessage = "Creation date is required")]
    [DisplayName("Creation Date")]
    [DataType(DataType.Date)]
    [Column(TypeName = "datetime2")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    public DateTime CreationDate { get; set; } = DateTime.Now;

    [Required(ErrorMessage = "Last activity date could not be registered")]
    [DisplayName("Last Activity Date")]
    [DataType(DataType.Date)]
    [Column(TypeName = "datetime2")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    private DateTime lastActivityDate;

    public DateTime ActivityDate
    {
        get { return lastActivityDate; }
        set { lastActivityDate = DateTime.Now; }
    }

    [DataType(DataType.ImageUrl)]
    [StringLength(2000, ErrorMessage = "That link is to long!")]
    [DisplayName("Profile Picture")]
    public string ProfilePictureURL { get; set; }

    [Required]
    [DisplayName("Gender")]
    public Gender Gender { get; set; } = Gender.Unknown;

    private string location = "POINT (0 0)";

    [Required]
    [DataType("geography")]
    [DisplayName("Location")]
    public string Location
    {
        get { return location; }
    }

    public string SetLocation(double latitude, double longitude)
    {
        location = String.Format("POINT({0} {1})", longitude, latitude).Replace(',', '.');
        return location;
    }
    public double GetLatitude()
    {
        return double.Parse(location.Split('(', ')')[0].Split(' ')[0]);
    }
    public double GetLongitude()
    {
        return double.Parse(location.Split('(', ')')[0].Split(' ')[1]);
    }

    [DisplayName("App Settings")]
    public AppSetting Appsetting { get; set; }

    [DisplayName("Email")]
    [DataType(DataType.EmailAddress, ErrorMessage = "Invalid email" )]
    [StringLength(320)]
    public string Email { get; set; }
    [Required]
    [DisplayName("Hidden")]
    public bool IsHidden { get; set; } = false;

    [Required]
    [DisplayName("Banned")]
    public bool IsBanned { get; set; } = false;

    //User can have multiple feedbacks
    public IEnumerable<Feedback> Feedback { get; set; }

    //User can have multiple reported users
    public IEnumerable<Reported> ReportedUsers { get; set; }

    //User can have multiple blocked users
    public IEnumerable<Blocked> BlockedUsers { get; set; }

    //User can have multiple connections
    public IEnumerable<Connection> Connections { get; set; }

    //User can have multiple categories
    public IEnumerable<UserCategory> UserCategory { get; set; }

    //User can have multiple roles
    public IEnumerable<UserRole> UserRole { get; set; }

    //User can have multiple messages
    public IEnumerable<Message> Messages { get; set; }

    //User can watch multiple advertisements
    public IEnumerable<Advertisement> Advertisement { get; set; }

    //User can watch multiple advertisements
    public IEnumerable<UserAdvertisement> WatchedAdvertisement { get; set; }

    //User can have multiple providers
    public IEnumerable<UserProvider> UserProvider { get; set; }
}

有什么建议吗?

编辑:

我的反馈收集有2个项目(2个反馈)。

仅显示1及其所有属性。

反馈模式:

public class Feedback
{
    [DisplayName("Id")]
    public int Id { get; set; }

    [Required(ErrorMessage = "A rating is required")]
    [DisplayName("Rating")]
    public int Rating { get; set; }

    [Required(ErrorMessage = "A feedbacksection is required")]
    [DisplayName("Section")]
    public FeedbackType FeedbackType { get; set; }

    [DisplayName("Message")]
    //[DataType("nvarchar(500)")]
    [StringLength(500, ErrorMessage = "That message is to long!")]
    public string Message { get; set; }

    [Required(ErrorMessage = "Creation date is required")]
    [DisplayName("Creation Date")]
    [DataType(DataType.Date)]
    [Column(TypeName = "datetime2")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    public DateTime CreationDate { get; set; } = DateTime.Now;

    [Required]
    [DisplayName("User")]
    public int UserId { get; set; }
    public User User { get; set; }
}

1 个答案:

答案 0 :(得分:3)

即使没有自我反应异常,也会发生。

以下示例解决了我的问题。

(谢谢@Tseng&amp; @Liam推动我朝着正确的方向前进)

    [HttpGet]
    public async Task<string> GetById(int id)
    {
        try
        {
            User user = await userManager.GetByIdAsync(id);
            JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            };

            return JsonConvert.SerializeObject(user, jsonSerializerSettings); ;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

如果您想要全球化:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().AddJsonOptions(options => 
     options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
}

输出:

{
"Id": 2,
"Username": "c8bee98",
"Firstname": "Firstname73",
"Lastname": "Lastname73",
"CreationDate": "2017-07-02T23:47:16.204588",
"ActivityDate": "2017-07-03T15:25:45.294169+02:00",
"ProfilePictureURL": "ProfilePictureURL73",
"Gender": 2,
"Location": "POINT(25.1400680863951 -25.0786780636193)",
"Appsetting": null,
"Email": "Email73",
"IsHidden": false,
"IsBanned": false,
"Feedback": [
    {
        "Id": 19,
        "Rating": 1,
        "FeedbackType": 0,
        "Message": "Message1",
        "CreationDate": "2017-07-02T23:47:18.2287331",
        "UserId": 2
    },
    {
        "Id": 20,
        "Rating": 1,
        "FeedbackType": 0,
        "Message": "Message1",
        "CreationDate": "2017-07-02T23:47:18.2287445",
        "UserId": 2
    }
],
"ReportedUsers": null,
"BlockedUsers": null,
"Connections": null,
"UserCategory": null,
"UserRole": null,
"Messages": null,
"Advertisement": null,
"WatchedAdvertisement": null,
"UserProvider": null
}