使用JsonConvert.SerializeObject进行系列化的Json数据始终是ASP.NET Web Api中的字符串

时间:2016-05-29 06:29:31

标签: json asp.net-mvc serialization asp.net-web-api

我正在开发一个ASP.NET MVC Web Api。项目。我正在以JSON格式返回数据。在我向用户返回数据之前,我使用JsonConvert.SerializeObject来序列化数据以更改其json属性名称。我的代码以JSON格式返回数据。但有一个问题。即使数据是数组或对象,它总是将数据返回到字符串中。请参阅下面的方案。

  

这是我的返回json的动作方法。

public HttpResponseMessage Get()
        {
            IEnumerable<Region> dbRegions = regionRepo.GetCachedRegions();
            List<ContentRegion> regions = new List<ContentRegion>();
            if(dbRegions!=null && dbRegions.Count()>0)
            {
                foreach(var region in dbRegions)
                {
                    ContentRegion contentRegion = new ContentRegion
                    {
                        Id = region.Id,
                        ImageUrl = Url.AbsoluteContent(region.ImagePath),
                        SmallImageUrl = (String.IsNullOrEmpty(region.ImagePath))?null:Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath,AppConfig.SmallThumbSuffix)),
                        MediumImageUrl = (String.IsNullOrEmpty(region.ImagePath))?null:Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath,AppConfig.MediumThumbSuffix)),
                        Name = region.Name,
                        MmName = region.MmName,
                        Description = region.Description,
                        MmDescription = region.MmDescription,
                        Latitude = region.Latitude,
                        Longitude = region.Longitude
                    };
                    regions.Add(contentRegion);
                }
            }
            string json = JsonConvert.SerializeObject(regions);
            if(!string.IsNullOrEmpty(json))
            {
                json = json.Trim(new char[] { '"' });
            }
            return new HttpResponseMessage(HttpStatusCode.OK)
            {

                Content = new ObjectContent(json.GetType(),json,Configuration.Formatters.JsonFormatter)
            };
        }

实际上这段代码应该返回Json数组。但是当我从客户端解析数据时(来自android使用凌空)。它无法解析为Json数组。

  

这是我得到的数据。

enter image description here

正如你可以在开头和结尾都看到双引号。我无法将其解析为Volley中的数组的原因是它因为双重而以字符串形式返回。那么请问我如何序列化修剪报价呢?我使用了修剪,但没有删除。那么我该如何解决这个问题呢?

4 个答案:

答案 0 :(得分:1)

你不必要地使事情复杂化。在Web API中,只需返回内置方法中的任何对象即可返回JSON,框架将为您序列化它。

public IHttpActionResult Get()
{
    IEnumerable<Region> dbRegions = regionRepo.GetCachedRegions();
    List<ContentRegion> regions = new List<ContentRegion>();
    if(dbRegions != null && dbRegions.Count() > 0) {
        foreach(var region in dbRegions)
        {
            ContentRegion contentRegion = new ContentRegion
            {
                Id = region.Id,
                ImageUrl = Url.AbsoluteContent(region.ImagePath),
                SmallImageUrl = (String.IsNullOrEmpty(region.ImagePath))?null:Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath,AppConfig.SmallThumbSuffix)),
                MediumImageUrl = (String.IsNullOrEmpty(region.ImagePath))?null:Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath,AppConfig.MediumThumbSuffix)),
                Name = region.Name,
                MmName = region.MmName,
                Description = region.Description,
                MmDescription = region.MmDescription,
                Latitude = region.Latitude,
                Longitude = region.Longitude
            };
            regions.Add(contentRegion);
        }
    }

    return Ok(regions);
}

顺便说一句:从我所看到的,您将您的域对象手动映射到DTO:考虑使用自动映射机制,如AutoMapper

答案 1 :(得分:1)

我不确定这是否是最佳解决方案。我用这种方式解决了这个问题。

  

这是我的行动方法

public HttpResponseMessage Get()
        {
            try
            {
                IEnumerable<Region> dbRegions = regionRepo.GetCachedRegions();
                List<ContentRegion> regions = new List<ContentRegion>();
                if (dbRegions != null && dbRegions.Count() > 0)
                {
                    foreach (var region in dbRegions)
                    {
                        ContentRegion contentRegion = new ContentRegion
                        {
                            Id = region.Id,
                            ImageUrl = Url.AbsoluteContent(region.ImagePath),
                            SmallImageUrl = (String.IsNullOrEmpty(region.ImagePath)) ? null : Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath, AppConfig.SmallThumbSuffix)),
                            MediumImageUrl = (String.IsNullOrEmpty(region.ImagePath)) ? null : Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath, AppConfig.MediumThumbSuffix)),
                            Name = region.Name,
                            MmName = region.MmName,
                            Description = region.Description,
                            MmDescription = region.MmDescription,
                            Latitude = region.Latitude,
                            Longitude = region.Longitude
                        };
                        regions.Add(contentRegion);
                    }
                }
                string json = JsonConvert.SerializeObject(regions);

                return new HttpResponseMessage(HttpStatusCode.OK)
                {

                    Content = new StringContent(json, Encoding.Default, "application/json")
                };
            }
            catch
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }
        }

答案 2 :(得分:0)

不需要将对象转换为json字符串。 你可以尝试:

return Request.CreateResponse<List<ContentRegion>>(HttpStatusCode.OK,regions);

未经测试。

答案 3 :(得分:0)

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 


Use this line in your WebApiConfig.



And here your code should be


  public HttpResponseMessage Get()
        {
            IEnumerable<Region> dbRegions = regionRepo.GetCachedRegions();
            List<ContentRegion> regions = new List<ContentRegion>();
            HttpResponseMessage temp = ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "");
            if (dbRegions != null && dbRegions.Count() > 0)
            {
                foreach (var region in dbRegions)
                {

                    ContentRegion contentRegion = new ContentRegion
                    {
                        Id = region.Id,
                        ImageUrl = Url.AbsoluteContent(region.ImagePath),
                        SmallImageUrl = (String.IsNullOrEmpty(region.ImagePath)) ? null : Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath, AppConfig.SmallThumbSuffix)),
                        MediumImageUrl = (String.IsNullOrEmpty(region.ImagePath)) ? null : Url.AbsoluteContent(CommonHelper.GetImageUrl(region.ImagePath, AppConfig.MediumThumbSuffix)),
                        Name = region.Name,
                        MmName = region.MmName,
                        Description = region.Description,
                        MmDescription = region.MmDescription,
                        Latitude = region.Latitude,
                        Longitude = region.Longitude
                    };
                    regions.Add(contentRegion);
                }
            }

            temp = ControllerContext.Request.CreateResponse(HttpStatusCode.OK, regions);
            return temp;

            //string json = JsonConvert.SerializeObject(regions);
            //if (!string.IsNullOrEmpty(json))
            //{
            //    json = json.Trim(new char[] { '"' });
            //}
            //return new HttpResponseMessage(HttpStatusCode.OK)
            //{

            //    Content = new ObjectContent(json.GetType(), json, Configuration.Formatters.JsonFormatter)
            //};
        }