【问题标题】:JSON Parsing from Javascript Serialized Object从 Javascript 序列化对象解析 JSON
【发布时间】:2014-01-09 19:24:53
【问题描述】:

当尝试从 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

【问题讨论】:

  • 您收到什么“错误”? 究竟是怎么说的?
  • @RocketHazmat 我已将错误消息添加到问题中

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


【解决方案1】:

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

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

【讨论】:

  • 此外,您可以通过删除引号再删除 1 步,从而有效地消除将 json 转换为数组/对象的需要。但是,由于您将其用双引号括起来,由于 json 包含未转义的双引号,这不会导致语法错误吗?
  • @KevinB 删除引号确实有效。因此,它实际上不是 var array = "@Html.Raw(Json.Encode(Model.JsonData))",而是 var array = @Html.Raw(Json.Encode(Model.JsonData)),这会在智能感知中引发错误视觉工作室,但编译和运行正常。
  • 好吧,您正在混合服务器端和客户端代码,我希望它会告诉您这是错误的。 :p @Html 是无效的 javascript,这可能是编辑器抛出错误的原因。
  • 我是否应该将此答案标记为已接受的答案,因为它已在评论中技术性地回答。
  • 我愿意,这基本上是正确的。或者写你自己的答案来显示完全正确的答案
【解决方案2】:

问题有两个方面。首先,您对 json 进行双重编码,导致双引号被替换为 "。其次,一旦你停止对它进行双重编码,字符串内部的双引号将由于外部的双引号而中断。两者最一致的解决方案是不将其包裹在双引号中并且不对其进行双重编码。

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

尽管如此,这让您对脚本注入完全开放,因此我建议返回将其用双引号括起来,然后使用正确转义内部双引号 \" 在服务器端。

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

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2017-06-04
    • 2020-01-08
    • 2012-03-06
    • 2013-09-02
    • 1970-01-01
    • 2016-12-30
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多