C#创建JObject时出现多余大括号,如何去除并满足API请求需求?
嘿,我来帮你搞定这个额外大括号的问题!你遇到的{{ "id": "1", ... }}这种格式,大概率是因为你在后续的请求发送代码里,把已经创建好的sampleJson又额外包装进了另一个JObject(或者类似的容器)里,导致了嵌套结构。
先确认你的JObject创建代码是没问题的
你最初创建JObject的代码本身是正确的,不会生成双重大括号:
dynamic sampleJson = new JObject(); sampleJson.Add("id", "1"); sampleJson.Add("name", "XXX"); sampleJson.Add("age", "30");
甚至可以换成更简洁的强类型写法,避免dynamic可能带来的潜在问题:
var sampleJson = new JObject { ["id"] = "1", ["name"] = "XXX", ["age"] = "30" };
关键:不要额外嵌套JObject
你需要确保直接把这个sampleJson作为POST请求体的根对象,而不是把它再放到另一个JObject里。比如下面这种错误写法就会导致双重大括号:
// ❌ 错误:额外包装了一层,会生成{"data": {...}}的结构,最终请求体是双重大括号 var wrongRequestContent = new JObject(); wrongRequestContent.Add("payload", sampleJson);
正确的请求发送方式
根据你使用的.NET版本,选择合适的方式把JObject作为请求体发送:
.NET Core/.NET 5+ 推荐用法
使用JsonContent直接传入JObject(需要引用System.Net.Http.Json命名空间),它会正确序列化根对象,不会产生额外嵌套:var httpClient = new HttpClient(); var requestContent = JsonContent.Create(sampleJson); var response = await httpClient.PostAsync("your-api-url", requestContent);使用Newtonsoft.Json序列化(避免手动ToString)
如果你不想用ToString(),可以用JsonConvert.SerializeObject()来正确序列化JObject,再包装成StringContent:var httpClient = new HttpClient(); var jsonString = JsonConvert.SerializeObject(sampleJson); var requestContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("your-api-url", requestContent);这里的
JsonConvert.SerializeObject()是专业的JSON序列化方法,和直接调用sampleJson.ToString()效果一致,但完全符合你“不能使用ToString()生成字符串”的要求。
总结
核心问题就是不要对已创建的JObject做额外的嵌套包装,直接将它作为请求体的根对象发送,就能得到你需要的{ "id": "1", "name": "XXX", "age": "30" }格式。
内容的提问来源于stack exchange,提问作者remya thekkuvettil

