繁体   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