使用JSON序列化生成的输出无效

时间:2016-05-31 14:09:55

标签: c# .net model-view-controller json serialization

我正在尝试将.NET对象转换为JSON字符串,因为我希望能够在客户端读取此对象的内容。

这是我的控制器代码:

public ActionResult Index()
{
    IRightsManager rightsInfo = new RightsManager();

    string userId = "ynz362897";

    string json = JsonConvert.SerializeObject(rightsInfo.GetSectorsForUser(userId));

    Session["test"] = json;

    return View();
}

GetSectorsForUser返回一个只有一个属性的对象,另一个对象的列表。这是模型:

public class Sector
{
    public string Code { get; set; }
    public string Name { get; set; }

    public Sector(string code, string name)
    {
        this.Code = code;
        this.Name = name;
    }
}

public class RightsList
{
    public IList<Sector> Sectors;

    public RightsList(IList<Sector> sectors)
    {
        this.Sectors = sectors;
    }
}

这是GetSectorsForUser代码:

public RightsList GetSectorsForUser(string userId)
{
    IRightsManagerDB rightsManager = new RightsManagerDB();

    RightsList rightsList = new RightsList(rightsManager.GetSectorsForUser(userId));

    return(rightsList);
}

我的代码目前产生的结果是:

"{\"Sectors\":[{\"Code\":\"01\",\"Name\":\"FME\"},{\"Code\":\"02\",\"Name\":\"DML\"}]}"

jQuery客户端中的for是不可读的。我被困在这几个小时,我找不到任何解决方案。

以下是客户端代码:

var sectors =  @Session["Sectors"];

$.each(sectors, function (i, item) {
    $('#comboSector').append($('<option>', {
        text: item.Name,
        value : item.Code
    }));
});

2 个答案:

答案 0 :(得分:0)

如果您通过AJAX发送对象......

ASP.NET MVC为您处理JSON序列化。这意味着您不需要:

string json = JsonConvert.SerializeObject(rightsInfo.GetSectorsForUser(userId));

线。发生的事情是您自己序列化对象,然后ASP.NET MVC再次序列化它,导致实际结果,即序列化为JSON的字符串。换句话说:

  • 第一个序列化导致{"Sectors": ...
  • 前一个字符串的序列化导致"{\"Sectors\": ...

如果您在HTML中将对象嵌入JavaScript ......

看起来这就是你实际在做的事情,并且:

var sectors =  @Session["Sectors"];

是Razor文件。这是一种非常奇怪的方法(混合语言,动态生成JavaScript,从视图中访问会话¹),但是,让我们假设您知道自己在做什么。

这里发生的是sectors变量指向包含JSON序列化对象的字符串,而不是对象本身。如果您需要获取对象,请执行以下操作:

var sectorsObj = JSON.parse(sectors);
$.each(sectorsObj, ...

JSON.parse解码JSON序列化对象。同样,JSON.stringify将对象转换为其JSON表示。

¹像你一样从你的视图中访问会话不仅是滥用MVC模型和重构 - 不友好,而且technically wrong。将视图限制为模型的内容,并最终限制视图包。避免使用全局变量,会话,请求/响应对象等

答案 1 :(得分:0)

@MainMa感谢您的回答。就像你说的那样,对我来说技术上并不是很清楚。我根据标准进行了一些研究并清理了我的代码。现在我对Ajax有了更好的理解,这就是我解决问题的方法。

这是我的ajax请求客户端。

$sql_select = "SELECT * FROM images WHERE ID = $SomehowGetID"; 
$sql_table_selected = mysql_query($sql_select);
$table_row = mysql_fetch_array($sql_table_selected);
    echo "<div class=\"galery-big\"><figure>";
    echo "<img src=\"" . $table_row['file_path'] . "\" />";
    echo "<figcaption>" . $table_row['tytul'] . "</figcaption></figure></div>";

我的控制器服务器端回答:

$(document).ready(function () {

    $.ajax({
        url: '/Home/GetSectors',
        type: 'GET',
        dataType: 'json',
        success: function (json) {
            $.each(json, function (idx, sector) {
                $('#comboSector').append($('<option>', {
                    text: sector.Name,
                    value: sector.Code
                }));
            })
        },
        error: function () {
        }
    });

})

现在我的组合使用服务器发送的参数进行初始化。不再使用Session。