簡體   English   中英

C# Web API:遍歷 JSON Object 數組

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM