HttpResponseMessage 内容时出现无效占位符错误

Invalid Placeholder error while HttpResponseMessage content

我正在编写单元测试并且必须 return 响应对象。我能够 return 下面的回复

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

但现在需要将所有响应包装在 'data' 属性 中。对于如下更新的代码

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 参数) String.FormatHelper(IFormatProvider 提供程序、字符串格式、ParamsArray 参数) String.Format(字符串格式,对象[]参数)

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

您可以使用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());
    }
}

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

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

尝试了很多选项并以以下结尾。

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

如果要避免序列化,可以使用 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}' }} }}")
};