敲除映射.fromjson与后斜线(文件路径值)挣扎



我试图将对象结构传递给我的HTML,以绑定到HREF。由于" ",问题变成文件路径(通往.EXE的路径)。

下面的示例:

var categories = ko.mapping.fromJSON('[{"Applications":[{"Documentation":null,"ApplicationId":2,"Name":"PSSE","Description":"Model software","LocalExePath":"aecies://runApp?C:Program Files (x86)MyAppapp.exe"}],"Name":"foobar"}]');

对不起,如果我弄乱了一些语法,我正在采用更大的json对象并将其压缩为一个例子,可能会错过某个地方的括号。无论如何,在上述情况下,exepath类别中出现的是一个带有" 's"的字符串。如果我强迫每个''将其变为" \",那就失败了说不了解标识符P(显然是在C: program上打破)。

马丁的回答似乎是我想要的,但是我提出的问题是我需要从json那里做什么。问题在于我的代码实际上并不是什么样。这就是从 @html.raw()中吐出的东西。下面我添加了实际的代码。问题是我不能只用四个 s添加另一个替换,因为它会将添加到每个JSON标题中。(最终看起来像[{\\"应用程序\\")

var categories = ko.mapping.fromJSON(
        '@Html.Raw(JsonConvert.SerializeObject(Model.Categories, 
                    Formatting.None, 
                    new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml, ReferenceLoopHandling = ReferenceLoopHandling.Ignore}
                                  ).Replace("\u0022", "\"").Replace(""", "\""))');

我使用的两个可能的修复程序是字符串。在控制器中重新格式化数据。或为我的数据库记录中的每个斜线都有两个斜线。通过序列化和html.raw,如果数据库中有2个,则最终以正确的4量。是否有第三个选项可以让我在数据库中存储实际的路径字符串(没有额外的斜杠,'c: hellodir '),但在我的剃须刀代码中添加一行以替换我关心的斜线。

编辑:stackoverflow不喜欢我进行双重斜线,这是完美的,因为我的大部分问题都在映射中。

edit2:问题

还有更多

您实际上需要四个后斜切,因为您正在经过2层解码:

  1. javaScript字符串文字(\ to )
  2. json解码(转向\)

所以您需要:

var categories = ko.mapping.fromJSON('[{"Applications": [{"Documentation":null,"ApplicationId":2,"Name":"PSSE","Description":"Model software","LocalExePath":"aecies://runApp?C:\\Program Files (x86)\\MyApp\\app.exe"}],"Name":"foobar"}]');

您可以在http://jsfiddle.net/gjb4h0jy/2/

对于任何寻求解决斜线问题的解决方案的人,我清楚地表明,EscapeHTML条目正在炸毁。如果我将其删除,然后处理我想要通过替换语句逃脱的特定特殊角色,那么一切都可以很好地工作。

var categories = ko.mapping.fromJSON(
        '@Html.Raw(JsonConvert.SerializeObject(Model.Categories,
                    Formatting.None,
                    new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore}
                                  ).Replace(@"rn", "").Replace(@"'", @"'").Replace(@"/", @"/").Replace(@"\", @"\\").Replace(""", "\""))');