<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; json</title>
	<atom:link href="http://blog.11034.org/tag/json/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>JSON中出现解析错误的原因之一：不可打印字符</title>
		<link>http://blog.11034.org/2015-04/json_ascii.html</link>
		<comments>http://blog.11034.org/2015-04/json_ascii.html#comments</comments>
		<pubDate>Thu, 09 Apr 2015 08:59:36 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2407</guid>
		<description><![CDATA[JSON规范规定，字符串需要用Unicode传输，而对于ASCII码中的前32个不可打印字符（第33个字符为空 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>JSON规范规定，字符串需要用Unicode传输，而对于ASCII码中的前32个不可打印字符（第33个字符为空格）应该转化为明文的转义模式，比如换行符0A：&#8221;\n&#8221;，出现在json中就应该是明文的\n，所以内部表示就应该是&#8221;\\n&#8221;。</p>
<p>所以假如一个json字符串中出现了01-1F这31个字符（00空字符倒是不会出现错误），json就会解析错误。</p>
<p><span id="more-2407"></span></p>
<p>Ruby on Rails中的to_json方法，默认并没有将这31个字符给正确转义为json格式，会引起错误。</p>
<p>用Rails的console举例：</p>
<div id="attachment_2408" style="width: 495px" class="wp-caption aligncenter"><img class="size-full wp-image-2408" alt="ASCII码转json测试" src="http://blog.11034.org/wp-content/uploads/2015/04/asc.png" width="485" height="268" /><p class="wp-caption-text">ASCII码转json测试</p></div>
<p>所以可能要手动去删除1-31号不可显示的ASCII码，除了\n\r\t之外，一般来说这些字符对于内容显示上不存在作用。</p>
<p>补充一点，ASCII表的最后一个字符127位为DEL (delete)，虽然可能也算不可打印字符，不过这个字符不会引起json解析错误。</p>
<p>附上ASCii码表：<a href="http://www.asciima.com/">http://www.asciima.com/</a></p>
<p>一种解决办法：对to_json解析后的字符串进行字符过滤</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">    <span style="color:#9966CC; font-weight:bold;">def</span> to_json<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        json_str = <span style="color:#0066ff; font-weight:bold;">@data</span>.<span style="color:#9900CC;">to_json</span><span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span>
        bytes = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        json_str.<span style="color:#9900CC;">each_byte</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c<span style="color:#006600; font-weight:bold;">|</span>
            <span style="color:#9966CC; font-weight:bold;">next</span> <span style="color:#9966CC; font-weight:bold;">if</span> c <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> c <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#006666;">31</span>
            bytes <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> c
        <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#0000FF; font-weight:bold;">return</span> bytes.<span style="color:#9900CC;">pack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'C*'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h4  class="related_post_title">随便看一看</h4><ul class="related_post"><li>2011-05-07 -- <a target="_blank" href="http://blog.11034.org/2011-05/zhijiang_campus.html" title="之江校区游">之江校区游</a></li><li>2011-09-17 -- <a target="_blank" href="http://blog.11034.org/2011-09/moon_of_west_lake.html" title="平湖秋月，听湖赏月">平湖秋月，听湖赏月</a></li><li>2012-09-25 -- <a target="_blank" href="http://blog.11034.org/2012-09/xiaoao_jianghu.html" title="笑傲江湖">笑傲江湖</a></li><li>2010-11-05 -- <a target="_blank" href="http://blog.11034.org/2010-11/%e7%a9%ba%e4%b9%8b%e8%bd%a8%e8%bf%b9sc.html" title="空之轨迹SC，让我感动了一把">空之轨迹SC，让我感动了一把</a></li><li>2010-12-16 -- <a target="_blank" href="http://blog.11034.org/2010-12/wp-sns-share_update_to_1-4.html" title="wp-sns-share更新至1.4">wp-sns-share更新至1.4</a></li></ul><h4 class="related_post_title">看看 Javascript , ruby on rails </h4><ul class="related_post"><li>2015-08-12 -- <a target="_blank" href="http://blog.11034.org/2015-08/rails_nginx.html" title="Liunx下搭建Rails和Nginx环境">Liunx下搭建Rails和Nginx环境</a></li><li>2014-12-21 -- <a target="_blank" href="http://blog.11034.org/2014-12/ruby_encoding.html" title="Ruby字符串的编码">Ruby字符串的编码</a></li><li>2014-10-25 -- <a target="_blank" href="http://blog.11034.org/2014-10/linux_timeout.html" title="linux的timeout处理wkhtmltopdf进程超时">linux的timeout处理wkhtmltopdf进程超时</a></li><li>2014-10-04 -- <a target="_blank" href="http://blog.11034.org/2014-10/rails-has_many.html" title="Rails中has_many等的原理">Rails中has_many等的原理</a></li><li>2014-07-28 -- <a target="_blank" href="http://blog.11034.org/2014-07/active_support_235.html" title="简析Rails：active_support 2.3.5">简析Rails：active_support 2.3.5</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2015-04/json_ascii.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
