在 ASP.NET Core 中构建 Web API。
我有一个控制器操作,它接收请求(带有
byte[]
的对象),并且在响应中它应该返回动态生成的 JSON 值(这是一个解析操作)。因此,我无法在响应中强类型化对象,因为它取决于请求。
我的响应类如下所示:
public class ConversionResponse
{
public string Json { get; set; }
}
操作实现如下(精简版):
[HttpGet()]
public async Task<IActionResult> ConvertFile(ConversionRequest request)
{
// This just gets a json string (in my case an array, but could be any json string)
var json = await GetJsonAsync(request);
return Ok(new ConversionResponse{Json = json });
}
我得到的结果如下(其中json值被序列化为字符串)
{
"json": "[{\"Column1\":\"Value1\",\"Column2\":\"Value2\"},{\"Column1\":\"Value4\",\"Column2\":\"Value5\"}]"
}
我希望的结果如下
{
"json": [{"Column1":"Value1","Column2":"Value2"},{"Column1":"Value4","Column2":"Value5"}]
}
我尝试将
json
字符串解析为 JObject
或 JToken
并将其包含在响应对象中,而不是 string
,但这似乎也不起作用。
非常感谢任何解决此问题的帮助!
首先,在您的示例中,您在
public string Json { get; set; }
类中定义 ConversionResponse
,这应该会返回 {"json":"string content here"}
。
那么你要返回的是
{"json" : [ ]}
,那么参数json
的值就是一个数组。但现在我们拥有的是一个数组字符串。因此,获取所需返回数据的最简单方法应该是将 array string
转换为 json object
。我使用如下代码:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
string arrayString = "[{\"Column1\":\"Value1\",\"Column2\":\"Value2\"},{\"Column1\":\"Value4\",\"Column2\":\"Value5\"}]";
string formatString = string.Concat("{\"json\":", arrayString, "}");
JObject jsonObj1 = JObject.Parse(formatString);
JObject jsonObj2 = JsonConvert.DeserializeObject<JObject>(formatString);
var val1 = jsonObj1["json"][0]["Column1"];
var val2 = jsonObj2["json"][1]["Column1"];
就像你看到的,我先将数组字符串转换为json字符串,然后将json字符串转换为json对象。而如果我们只想返回整个json对象,我们可以直接
return Ok(formatString);
。就像在前端一样,我们可以将响应定义为 json,然后 json 字符串将自动转换为 json 对象。我们还可以在控制器操作前面添加[Produces("application/json")]
,将json字符串转换为json对象。