[英]C# Web API: Looping over JSON Object Array
我正在构建一个 C# Web API,一旦您将数据发布到端点,它将生成一个 HTML email,其中包含发布的值。
不幸的是,我坚持如何解析和循环包含键/值对的 JSON 数组,并最终生成一个 HTML 表行作为结果。
示例 JSON 数据 im 测试:
{
"Submitter":[
{
"Obj1":[
"test",
"test2"
]
},
{
"Obj2":[
"test3",
"test4"
]
}
]
}
代码:
public class TestingController : ControllerBase
{
public object Submitter { get; set; }
public string POST([FromBody] TestingController data)
{
var json = JsonConvert.SerializeObject(data.Submitter);
var jsonObjects = JObject.Parse(json);
var submitData = jsonObjects["Submitter"];
string body = "";
foreach (var item in submitData)
{
body += $"{item["Obj1"]}"; // Not working
}
return body;
}
}
一旦能够成功循环数组,所需的 html 渲染:
body += $"<tr><td>{item["Obj1"]}</td><td>{item["Obj2"]}</td></tr>"
编辑
我还在挣扎,但慢慢地更近了一步:
public class TestingController : ControllerBase
{
public List<SubmitterObjects> Submitter { get; set; }
public class SubmitterObjects
{
public List<string> Obj1 { get; set; }
public List<string> Obj2 { get; set; }
}
public string POST([FromBody] TestingController data)
{
var json = JsonConvert.SerializeObject(data);
dynamic myDeserializedClass = JsonConvert.DeserializeObject(json);
string body = "";
foreach (var item in myDeserializedClass.Submitter)
{
body += $"<tr><td>{item.Obj1}</td><td>{item.Obj2}</td></tr>";
}
return body;
}
}
结果(奇怪):
<tr><td>[
"test",
"test2"
]</td><td></td></tr><tr><td></td><td>[
"test3",
"test4"
]</td></tr>
所需的 HTML 表结果:
| Object 1 | Object 2 |
|----------|----------|
| Test | Test 3 |
| Test 2 | Test 4 |
代码中有一些错误和不良做法。 我在下面评论了它们:
public class TestingController : ControllerBase
{
// Bad practice: Having an object with type "object". Using strict types is encouraged
public object Submitter { get; set; }
// Bad practice: The type of "data" is the same as the controller.
public string POST([FromBody] TestingController data)
{
var json = JsonConvert.SerializeObject(data.Submitter);
var jsonObjects = JObject.Parse(json);
var submitData = jsonObjects["Submitter"];
string body = "";
foreach (var item in submitData)
{
// Here the item["Obj1"] is not a string, it's an array, so you get an error.
// Bad practice: Returning an HTML right in the controller.
// If you have a separate frontend, then it would be better to just return
// the results in an array or json, and format it in frontend instead
body += $"{item["Obj1"]}"; // Not working
}
return body;
}
}
这是代码的固定版本。
首先,有强类型类:
public class Submitter
{
public List<string> Obj1 { get; set; }
public List<string> Obj2 { get; set; }
}
public class MyData
{
public List<Submitter> Submitter { get; set; }
}
然后像这样修改Post
方法以迭代项目:
public string POST([FromBody] MyData data) // Note: The type is changed to MyData
{
// Note: We don't need the deserializing logic anymore, as it's already automatically done by .net
string body = "";
foreach (var item in data.Submitter)
{
if (item.Obj1 != null) {
body += "<tr>";
// Note: You can use LINQ to simplify this loop...
foreach (var objItem in item.Obj1) {
body += $"<td>{objItem}</td>";
}
body += "</tr>";
}
if (item.Obj2 != null) {
body += "<tr>";
foreach (var objItem in item.Obj2) {
body += $"<td>{objItem}</td>";
}
body += "</tr>";
}
}
return body;
}
另请注意,您是根据列数据而不是行来填充表格,因此您需要对 css 进行一些小的更改,就像在此答案中所做的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.