2016-09-21 35 views
1

我遇到了我创建的asp.net REST API的问题。 Get请求返回的JSON字符串具有如下所示的尾随空格。从JSON中删除尾随空白(ASP.NET API)

在做网络浏览时,我发现这个链接(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"} 

提供的任何援助将不胜感激。

+3

你如何生成这个JSON?修剪那里的价值! – Scoregraphic

+0

你可以在你创建JSON的地方显示代码吗?正如@分析图表示,你必须修正值有一个简单的解决方案 – feeeper

+0

根据Shailesh Kopardekar的建议发现问题。额外的空格是由于我在这里从 –

回答

0

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

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

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

+0

OP中提取的数据库中额外的nchar空格......这就是答案。我将这些值从nchar(10)设置为列数据类型的数据库中提取。荣誉指出 –

+0

我有varchar - 它无论如何增加空格... :(奇怪。 – Alexander

1

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

希望它有帮助!

0

默认的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(); 
    } 
} 

你必须到转换器添加到您的转换器在Register方法在WebApiConfig类和类将看起来如此:

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()); 

} 

A第二你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}

+0

应该是更简单,像一个选项:“trim char data”。想象一下,如果你有数百个属性和数百个对象? – Alexander

+0

@Alexander我认为你可以使用反射:1.'CanConvert'应该为所有你需要的序列化类返回'true'; 2.在'WriteJson'方法中获取所有的公共属性并将它们序列化 – feeeper