MVC中反序列化JSON后嵌套对象显示异常,如何正确打印键值?
解决MVC视图中ExpandoObject嵌套内容无法展开显示的问题
问题原因
用ExpandoObject反序列化嵌套JSON后,视图直接输出嵌套对象的Value时,会调用其默认ToString()方法,显示类型名System.Dynamic.ExpandoObject,而非实际的键值对内容。需要递归识别并渲染所有层级的动态对象。
解决方案:在视图中添加递归渲染逻辑
通过在MVC视图中定义递归辅助方法,根据值的类型做不同处理:
- 若为
ExpandoObject,递归遍历其内部键值对 - 若为非字符串类型的集合,遍历每个元素
- 普通类型直接输出值
具体代码修改
- 在视图中添加递归辅助方法:
@helper RenderDynamicValue(dynamic value, int indentLevel = 0) { // 用缩进区分层级 var marginLeft = indentLevel * 20; if (value is ExpandoObject expando) { <ul style="margin-left:@marginLeft px; list-style-type: disc;"> @foreach (var kvp in expando) { <li> <strong>@kvp.Key:</strong> @RenderDynamicValue(kvp.Value, indentLevel + 1) </li> } </ul> } else if (value is IEnumerable enumerable && !(value is string)) { <ul style="margin-left:@marginLeft px; list-style-type: circle;"> @foreach (var item in enumerable) { <li>@RenderDynamicValue(item, indentLevel + 1)</li> } </ul> } else { <span>@value</span> } }
- 修改原视图的遍历逻辑,调用辅助方法渲染值:
@if (Model != null) { <table border="1" cellpadding="8"> @foreach (var d in Model.config) { <tr> <td><strong>@d.Key</strong></td> <td>@RenderDynamicValue(d.Value)</td> </tr> } </table> <p style="margin-top:16px;"><strong>时间戳:</strong>@Model.datetimestamp</p> }
效果说明
修改后,视图会自动展开所有嵌套层级的ExpandoObject,比如Device、Bat Alarm、Network等对象会以缩进列表形式展示内部键值对,无需点击下拉菜单即可查看全部内容,层级关系清晰直观。
内容的提问来源于stack exchange,提问作者johnny stone
相关产品推荐
相关产品推荐

