【问题标题】:Invalid Placeholder error while HttpResponseMessage contentHttpResponseMessage 内容时出现无效占位符错误
【发布时间】:2020-04-17 04:07:51
【问题描述】:

我正在编写一个单元测试并且必须返回响应对象。我能够返回以下响应

var res = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                Content = new StringContent(string.Format("{{ 'email':'{0}', 'first_name':'{1}', 'last_name':'{2}', 'id':'{3}' }}", data.Email, data.FirstName, data.LastName, data.Id))
            };

但现在需要将所有响应包装在“数据”属性中。对于这个更新的代码,如下所示

var res = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                Content = new StringContent(string.Format("{{'data':{'email':'{0}','first_name':'{1}','last_name':'{2}','id':'{3}'}}}", data.Email, data.FirstName, data.LastName, data.Id))
            };

但低于错误

消息: System.FormatException :输入字符串的格式不正确。 堆栈跟踪: StringBuilder.FormatError() StringBuilder.AppendFormatHelper(IFormatProvider 提供程序,字符串格式,ParamsArray args) String.FormatHelper(IFormatProvider 提供程序,字符串格式,ParamsArray args) String.Format(字符串格式, Object[] args)

不确定这里有什么问题。请帮忙。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core xunit


    【解决方案1】:

    您可以使用 Newtonsoft.Json

    using System;
    using Newtonsoft.Json;
    using System.Text;
    using System.IO;
    
    public class Program
    {
        public static void Main()
        {
             var data = new
            {
                email = "data@ada.com",
                first_name = "abc",
                last_name = "abc",
                id = 1
            };
    
            var data1 = new {data};
            var s = new JsonSerializer();
            var sb = new StringBuilder();
            using (var w = new StringWriter(sb))
            {
                s.Serialize(w, data1);
            }
            Console.WriteLine(sb.ToString());
        }
    }
    

    【讨论】:

    • 你用过 newtonsoft json 吗?您将直接获取要发布的内容,不会有字符串生成器。怎么会出现同样的错误?
    • 我需要返回字符串内容作为响应,Newtonsoft 生成的字符串不起作用。我正在使用 JsonConvert.DeserializeObject 来解析类对象。
    【解决方案2】:

    我没有太多时间看,但你可以试试这个吗?

    var res = new HttpResponseMessage()
    {
        StatusCode = HttpStatusCode.OK,
        Content = new StringContent(string.Format("{{'data':{'email':'{0}','first_name':'{1}','last_name':'{2}','id':'{3}'}}}", data.data.Email, data.data.FirstName, data.data.LastName, data.data.Id))
    };
    

    【讨论】:

    • 你很亲密。感谢您的帮助。
    • 字符串格式异常。您可以修复您的文本。你应该尝试各种可能性。也许这适用于“data.data[Email]、data.data[FirstName]、data.data[LastName]、data.data[Id]”。
    【解决方案3】:

    尝试了很多选项并以下面的方式结束。

    string.Format("{{ 'data': {{ 'email':'{0}', 'first_name':'{1}', 'last_name':'{2}', 'id':'{3}' }} }}", data.Email, data.FirstName, data.LastName, data.Id);
    

    【讨论】:

      【解决方案4】:

      如果要避免序列化,可以使用 c# 7.0 功能 $ 字符串插值。 使用:

      var res = new HttpResponseMessage()
      {
          StatusCode = HttpStatusCode.OK,
          Content = new StringContent($"{{ 'data': {{ 'email':'{data.Email}', 'first_name':'{data.FirstName}', 'last_name':'{data.LastName}', 'id':'{data.Id}' }} }}")
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 2013-02-05
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多