[英]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.