【问题标题】:How to create exact JSON format to POST method in c# code?如何在 C# 代码中为 POST 方法创建精确的 JSON 格式?
【发布时间】:2019-12-05 07:04:55
【问题描述】:

Web 服务需要这种格式:

{
   "Data":"{\"Name\":\"HelloWorld\",\"BirthDate\":\"2020-03-03\",\"BirthPlace\":\"Nowhere\"}"
}

我需要上述格式才能发布到网络服务,但我下面的代码不符合格式。请帮忙。我一直在使用下面的代码发布

 var Data = JsonConvert.SerializeObject(new
 {
    Data = new
    {
      Name= "HelloWorld",
      BirthDate = "2020-03-03",
      BirthPlace= "Nowhere"
    }
 });
 using (var client = new HttpClient())
 {
    HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl, Data);
 }

【问题讨论】:

  • 您确定不需要在引号中添加转义符吗? (\")
  • 打印你得到的字符串并将它与你需要的字符串进行比较。你会发现你得到了{"Data":{"Name":"HelloWorld","BirthDate":"2020-03-03","BirthPlace":"Nowhere"}}
  • 无关:using (var client = new HttpClient()) 只是为了举例,对吧?你不应该在生产代码中这样使用它。
  • 如果 data 属性必须是一个带有内部对象序列化的字符串,您可以简单地对其进行两次序列化。 var Data = Newtonsoft.Json.JsonConvert.SerializeObject( new { Data = Newtonsoft.Json.JsonConvert.SerializeObject(new { Name = "HelloWorld", BirthDate = "2020-03-03", BirthPlace = "Nowhere" }) });
  • @xdtTransform 你应该把它写下来作为答案。对我来说似乎是合理的,这与我的回答不同。事实上,我觉得它好一点。

标签: c# json post httprequest


【解决方案1】:

如果数据应该包含真实对象的字符串序列化。您可以使用字符串结果作为第二次序列化的值简单地序列化内部对象。

using Newtonsoft.Json;

public static string WrapAndSerialize(object value){
    return JsonConvert.SerializeObject(new { Data = JsonConvert.SerializeObject(value) });  
}

像这样使用它:

var myObject= 
  new
  {
     Name = "HelloWorld",
     BirthDate = "2020-03-03", 
     BirthPlace = "Nowhere",
  };

var Data= WrapAndSerialize(myObject);
using (var client = new HttpClient())
{
    HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl, Data);
}

LiveDemo

【讨论】:

    【解决方案2】:

    要获得所需的格式,请执行以下操作:

    string name = "HelloWorld";
    string birthdate = "2020-03-03";
    string birthplace= "Nowhere";
    var jsonData = JsonConvert.SerializeObject(new
    {
        Data = $"\"Name\"=\"{name}\",\"BirthDate\"=\"{birthdate}\",\"BirthPlace\"=\"{birthplace}\""
    });
    

    查看实际操作:https://dotnetfiddle.net/UBXDtd

    格式规定Data 应包含string。您的代码用属性序列化一个对象,结果是:

    {"Data":{"Name":"HelloWorld","BirthDate":"2020-03-03","BirthPlace":"Nowhere"}}
    

    编辑:虽然这可行,但我会推荐@xdtTransform 对此的回答。把这个留在这里,以防他的解决方案由于某种原因不适用。

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多