【问题标题】:Remove Trailing Whitespace from JSON (ASP.NET API)从 JSON 中删除尾随空格(ASP.NET API)
【发布时间】:2017-01-29 04:38:18
【问题描述】:

我创建的 asp.net REST API 有问题。从 Get 请求返回的 JSON 字符串具有如下所示的尾随空格。

在进行 webserches 时,我发现了这个链接 (Remove trailing spaces from Web API JSON),它显示了删除尾随空格的解决方案。问题是该链接未指示需要修改哪些文件(在 Visual Studio asp.net 解决方案中)。我需要一些帮助,因为我对此很陌生。此修复程序是否进入 Global.asax 文件?如果没有,它应该去哪里?除了提供的链接,我还应该考虑其他任何更改吗?

  • 我没有使用任何自定义 JSON 序列化程序。当您在 Visual Studio 中创建 asp.net 解决方案时,我使用的是现有的解决方案
  • 我从一个空白的 asp.net 解决方案创建了这个项目(但选中了“新建 ASP.NET 项目”对话框中的“Web API”复选框。
  • 提供的链接显示了 MVC API 的解决方案。我没有使用 MVC

我有什么:

{"ID":8,"Site":"EstevanPointCanada","PressureReading":"30.15     ","PressureTrend":"0         "}

我想要什么:

{"ID":8,"Site":"EstevanPointCanada","PressureReading":"30.15","PressureTrend":"0"}

我们将不胜感激。

【问题讨论】:

  • 如何生成这个 JSON?修剪那里的值!
  • 你能展示你在哪里创建 JSON 的代码吗?正如@Scoregraphic 所说,您必须修剪这些值,这是一个最简单的解决方案
  • 根据 Shailesh Kopardekar 的建议找到了该问题。额外的空格是由于我从数据库中提取的额外的 nchar 空格

标签: c# asp.net json rest json.net


【解决方案1】:

在生成 JSON 之前修剪值,或者您可以在集合上应用 foreach 并删除尾随空格。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    如果您使用 SQL 作为数据库并且该字段的数据类型为“CHAR”,则在将其转换为 JSON 时,结果将具有尾随空格。

    在序列化为 JSON 之前,您需要解析数据并将其转换为字符串并使用“Trim()”函数。

    如果您可以显示详细的代码,将有助于确定根本原因并提出解决方案。

    【讨论】:

    • OP here....这就是答案。我从将 nchar(10) 设置为列数据类型的数据库中提取这些值。感谢您指出这一点
    • 我有 varchar - 无论如何它都会添加空格... :( 奇怪。
    【解决方案3】:

    默认 ASP.NET Web API 模板包含 Json.Net 库。因此,您可以为您的类型实现自己的JsonConverter,这样当您的应用程序序列化该类型的实例时,它将使用您的自定义序列化程序。

    假设你的类型是这样的:

    public class Resp
    {
        public int ID { get; set; }
        public string Site { get; set; }
        public string PressureReading { get; set; }
        public int PressureTrend { get; set; }
    }
    

    所以自定义序列化器:

    public class RespConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(Resp);
        }
    
        public override bool CanRead
        {
            get
            {
                return false;
            }
        }
    
        public override bool CanWrite
        {
            get
            {
                return true;
            }
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var resp = (Resp)value;
            writer.WriteStartObject();
    
            writer.WritePropertyName("id");
            writer.WriteValue(resp.ID);
    
            writer.WritePropertyName("site");
            writer.WriteValue(resp.Site.Trim());
    
            writer.WritePropertyName("pressureReading");
            writer.WriteValue(resp.PressureReading.Trim());
    
            writer.WritePropertyName("pressureTrend");
            writer.WriteValue(resp.PressureTrend);
    
            writer.WriteEndObject();
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // the default deserialization works fine, 
            // but otherwise we'd handle that here
            throw new NotImplementedException();
        }
     }
    

    您必须在 WebApiConfig 类中的 Register 方法中将该转换器添加到您的转换器中,该类将如下所示:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
    
        // Web API routes
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    
        // Add custom converter here!
        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new RespConverter());
    
    }
    

    还有你的Get 方法:

    public HttpResponseMessage Get(int id)
    {
         return Request.CreateResponse<Resp>(HttpStatusCode.Accepted, 
                    new Resp { 
                        ID = 1, 
                        Site = "   34.4   ", 
                        PressureReading = "0     ", 
                        PressureTrend = 42 });
    }
    

    将返回:{"id":1,"site":"34.4","pressureReading":"0","pressureTrend":42}

    【讨论】:

    • 应该更简单一些,比如一个选项:“trim char data”。想象一下,如果您有数百个属性和数百个对象?
    • @Alexander 我认为您可以为此使用反射:1. CanConvert 应该为您所有需要序列化的类返回true; 2.获取WriteJson方法中的所有公共属性并序列化
    猜你喜欢
    • 2013-10-23
    • 2015-02-15
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2023-03-16
    相关资源
    最近更新 更多