从JSON中删除尾随空格(ASP.NET API)

时间:2016-09-21 05:01:00

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

我遇到了我创建的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解决方案创建了这个项目(但是检查了“New ASP.NET Project”对话框中的“Web API”复选框。
  • 提供的链接显示了MVC API的解决方案。我没有使用MVC

我得到了什么:

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

我想要的是什么:

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

非常感谢所提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

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

希望它有所帮助!!

答案 1 :(得分:0)

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

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

如果您可以显示详细的代码,那么找出根本原因&提出解决方案。

答案 2 :(得分: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());

}

您的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}