从Javascript序列化对象解析JSON

时间:2014-01-09 19:24:54

标签: jquery json parsing asp.net-mvc-4 json.net

当尝试从json中的对象解析序列化字符串时,我一直收到错误,说它无法解析。 Popwe类包含三个十进制特性(峰值,非峰值,周末)

我有一个由以下类组成的对象

public class MinimumsAndParentRates {
    public MinimumsAndParentRates() {
        PerCall = new ListPopwes(); 
        PerMinute = new ListPopwes();
    }

    public ListPopwes PerCall { get; set; }
    public ListPopwes PerMinute { get; set; }
}

public class ListPopwes {
    public ListPopwes() {
        MinimumMargin = new Popwe();
        MinimumRetention = new Popwe();
        MasterRate = new Popwe();
    }

    public Popwe MinimumMargin { get; set; }
    public Popwe MinimumRetention { get; set; }
    public Popwe MasterRate { get; set; }
}

然后我设置了一个视图模型属性,如此

viewmodel.JsonData = JsonConvert.SerializeObject(obj);

当我写出结果时,我得到以下字符串

{
    "PerCall":
    {
        "MinimumMargin":
        {
            "Peak":0.00000000,
            "OffPeak":0.00000000,
            "Weekend":0.00000000
        },
        "MinimumRetention":
        {
            "Peak":0.00000000,
            "OffPeak":0.00000000,
            "Weekend":0.00000000
        },
        "MasterRate":
        {
            "Peak":0.00000000,
            "OffPeak":0.00000000,
            "Weekend":0.00000000
        }
    },
    "PerMinute":
    {
        "MinimumMargin":
        {
            "Peak":0.00000000,
            "OffPeak":0.00000000,
            "Weekend":0.00000000
        },
        "MinimumRetention":
        {
            "Peak":0.20000000,
            "OffPeak":0.20000000,
            "Weekend":0.20000000
        },
        "MasterRate":
        {
            "Peak":1.00000000,
            "OffPeak":2.00000000,
            "Weekend":3.00000000
        }
    }
}

然而,当我尝试使用jquery将其解析为JSON时,我收到错误,我已尝试过以下内容。

    console.log("@Model.JsonData");
    var array = "@Html.Raw(Json.Encode(Model.JsonData))" //Error occurs on this line when using Html.Raw;
    var obj = $.parseJSON(array); //Error occurs on this line when not using Html.Raw
    console.log(array);

以下是我收到的错误消息

@Html.Raw - SyntaxError: missing ; before statement

parsing - SyntaxError: JSON.parse: unexpected character

2 个答案:

答案 0 :(得分:4)

当您将数据添加到模型时,已使用JsonConvert.SerializeObject(obj);将数据序列化为JSON。您无需使用Json.Encode第二次序列化它。

尝试:var array = "@Html.Raw(Model.JsonData)";

答案 1 :(得分:1)

问题是双重的。首先,您对json进行了双重编码,导致双引号被"替换。其次,一旦你停止对其进行双重编码,字符串中的双引号将因外部双引号而中断。两者最一致的解决方案是不用双引号括起来而不是对它进行双重编码。

var array = @Html.Raw(Model.JsonData);

虽然,这让你完全开放脚本注入,因此我建议回去用双引号包装然后使用双引号正确转义内部双引号 服务器端\"

当然,只有在json的源可以被恶意修改时才会发生脚本注入。