You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC中反序列化JSON后嵌套对象显示异常,如何正确打印键值?

解决MVC视图中ExpandoObject嵌套内容无法展开显示的问题

问题原因

用ExpandoObject反序列化嵌套JSON后,视图直接输出嵌套对象的Value时,会调用其默认ToString()方法,显示类型名System.Dynamic.ExpandoObject,而非实际的键值对内容。需要递归识别并渲染所有层级的动态对象。

解决方案:在视图中添加递归渲染逻辑

通过在MVC视图中定义递归辅助方法,根据值的类型做不同处理:

  • 若为ExpandoObject,递归遍历其内部键值对
  • 若为非字符串类型的集合,遍历每个元素
  • 普通类型直接输出值

具体代码修改

  1. 在视图中添加递归辅助方法:
@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>
    }
}
  1. 修改原视图的遍历逻辑,调用辅助方法渲染值:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:06:18