在JS中解析JSON字符串中的特殊字符

时间:2012-09-22 13:31:57

标签: javascript json parsing special-characters

今天,当我处理一些ajax请求时,我遇到了一个非常奇怪的问题。 发送简单请求后,JSON格式的服务器响应如下所示:

{
coach_id: "172"
email: "foo@bar.com"
focus_area: "Ke da\nMetrics"
id: "433"
success_metrics: "\"Calm\""
user_id: "809"
}

我想将此对象用作pure.js模板的数据(这没关系,因为它本身就是问题,而不是模板系统)。

$('#new-client').directives({
    '#client-email@value' : 'email',
    '#client-focus' : 'focus_area',
    '#client-success' : 'success_metrics'
}).render(myObject);

将简单输入,focus_area和success_metrics作为textareas发送电子邮件。

但是,我无法正确解析我的对象特殊字符。

例如“Ke da \ nMetrics”应该看起来: “柯达 指标“

我已经尝试过编码,替换字符等但没有效果。

任何提示?

字符串化后的整个对象:

{
    "id": "433",
    "coach_id": "172",
    "organization_id": "33",
    "user_id": "809",
    "start_date": "0202-02-02",
    "sessions_allotment": "5",
    "sessions_frequency": "TwiceAMonth",
    "sessions_frequency_other": "None",
    "tags": "KeTag,SanJose",
    "focus_area": "\\' \\\" Ke da\\nMetrics",
    "success_metrics": "\\\"Calm\\\"",
    "organization_level": "Grand P",
    "bill_rate": "34",
    "first_name": "Ke",
    "last_name": "Da",
    "email": "keda@mailinator.com",
    "coach_first_name": "Dawn",
    "coach_last_name": "Gilbert"
}

这是控制台日志http://screenshu.com/static/uploads/temporary/6n/0n/f2/2vt72y.jpg

2 个答案:

答案 0 :(得分:0)

\ n是Unix行结尾。

我不确定行结尾是否符合您的要求,但很像“Calm”会打印出来:

"Calm"

然后“Ke da \ nMetrics”会打印出来:

Ke da
Metrics

所以 - 在你的情况下 - 没有找到为什么在值中有一个行结尾 - 你可以使用这个代码:

myObject.focus_area = myObject.focus_area.replace(/\n/g, '');
$('#new-client').directives({
    '#client-email@value' : 'email',
    '#client-focus' : 'focus_area',
    '#client-success' : 'success_metrics'
}).render(myObject);

正如我所说 - 问题在于您的值的服务器编码 - 理想情况下JSON不包含\ n。


考虑上面 - 这可能是一个UTF8问题 - 对不起上面的错误答案......

如果您尝试使用utf8加载JSON作为编码,换行仍然显示?

答案 1 :(得分:0)

其中一个解决方案是使用JavaScript functions with directives并使用一些 过滤方法删除/替换/ ...输入JSON对象中的所有不需要的字符(例如删除\n或用空格替换\n;可以使用正则表达式完成)

您可以拥有更多过滤功能(每种功能都执行特定类型的过滤),并在带有指令的函数中将它们链接在一起。

假设您的过滤方法称为filter(arg)otherFilter(arg),您的指令可能如下:

$('#new-client').directives({
    '#client-email@value' : function(arg) { 
         return filter(arg.context.email); 
    },
    '#client-focus' : function(arg) { 
         return filter(arg.context.focus_area); 
    },
    '#client-success' : function(arg) { 
         return otherFitler(filter(arg.context.success_metrics)); 
    }
}).render(myObject);

我希望这会有所帮助。