从JSON解码为标准字符串

时间:2015-05-08 02:20:57

标签: javascript json angularjs

您好我正在使用REST服务来提取数据并使用angular来打印前端的数据。

我遇到的问题是被拉过的字符串已经转移了像'这样的实体。而不是'(撇号)例如。 “受到了法国和最受欢迎的社区的启发。” decodeURI似乎根本不起作用。
我找到了一个解决方法,通过创建自定义过滤器,使得创建一个虚拟元素,将innerHTML设置为虚拟元素,然后在解析并返回该值后获取它的innerHTML。

.filter("decoder", function() {
  return function(item) {
    var txt = item;
    var dummy = document.createElement('p');
    dummy.innerHTML = txt;
    txt = dummy.innerHTML;
    dummy.remove();
    return txt;
  }
})

感觉非常脏,所以我想知道它们是否是一种避免DOM操纵的方法。
谢谢!

2 个答案:

答案 0 :(得分:3)

您可以手动替换它们。

.filter("decoder", function () {
  return function (item) {
    return item
      .replace(/'/g, "'")
      .replace(/"/g, '"')
      .replace(/&/g, "&")
      .replace(/&lt;/g, "<")
      .replace(/&gt;/g, ">");
  }
})

我认为此列表涵盖了所有这些,但如果您看到其他内容,则可以随时添加。它仍然有点混乱,但我认为它比向DOM添加元素更好。

<强>更新

如果您正在寻找更完整的解决方案,可以执行以下操作:

.filter("decoder", function () {
  return function (item) {
    // it would be better to define this globally as opposed to within the function
    var ENTITIES = {
      '&amp': '&',
      '&amp;': '&',
      '&apos': '\'',
      '&apos;': '\'',
      '&gt': '>',
      '&gt;': '>',
      '&lt': '<',
      '&lt;': '<',
      '&quot': '"',
      '&quot;': '"'
    };
    return item.replace(/&#?[0-9a-zA-Z]+;?/g, function (entity) {
      if (entity.charAt(1) === '#') { // if it's a numeric entity
        var code;

        if (entity.charAt(2).toLowerCase() === 'x') { // if it's a hex code
          code = parseInt(entity.substr(3), 16);
        } else {
          code = parseInt(entity.substr(2));
        }

        if (isNaN(code) || code < -32768 || code > 65535) { // if it's not a valid numeric entity
          return '';
        }
        return String.fromCharCode(code);
      }
      return ENTITIES[entity] || entity;
    });
  }
});

正如您所看到的,此解决方案要复杂得多,但它确实涵盖了普通实体以及所有数字实体。如果您的目标是避免将来更新,那么这是您最好的选择。

答案 1 :(得分:0)

您可以使用ng-bind-html而不是使用过滤器对其进行解码。我认为这可以帮助您自动解码html字符串中的实体。