当json的键为json键值使用变量赋值而不是字符串时,怎么写

PHP JSON字符串赋值给JS变量的编码处理·更新最简单办法 -
- ITeye博客
博客分类:
B/S项目中PHP要实现如此功能:获得数据集json_encode为json字符串然后赋值给HTML页面中JS变量,再用parseJSON函数转换为JS对象供动态生成select下拉菜单条目。开始是这样实现的:
前后台数据库全部采用UTF-8编码
// 从数据库获得, 数值在入库前经过 htmlspecialchars($str) 编码过
$arr = array('k1' =& htmlspecialchars_decode($v1));
$str = json_encode($arr);
var tt = jQuery.parseJSON('&?php echo $?&');
使用正常。
不过当我需要把js变量的值取出来处理(比如赋值给input输入框时)就发现了问题——字符串是带有htmlspecialchar编码格式的。就是说原始的 a"b'c 字符串此时为
a&b&#039c ,之前用于生成select的HTML代码不会有问题,因为系统会自动转码。但是直接使用就需要人工转码。 于是借鉴
里面的例子用JS来解决:
if (typeof String.prototype.deentityify !== 'function') {
String.prototype.deentityify = function() {
var entity = {
quot : '"',
'#039' : '\'',
return function () {
return this.replace(/&([^&;]+);/g,
function(a, b) {
var r = entity[b];
return typeof r === 'string' ? r :
if (typeof String.prototype.entityify !== 'function') {
String.prototype.entityify = function() {
var character = {
: '''
return function () {
return this.replace(/[&&&"']/g,
function(c) {
return character[c];
var value = tt[20].deentityify() ;
考虑到需要转换效率问题,于是思考在服务端解决。
经过尝试,发现如果把数据先 htmlspecialchars_decode($str, ENT_QUOTES) (PHP 5 &= 5.1.0) 解码后再用 json_encode(),此时单元值中双引号编码为 【\"
】,而单引号不变化。比如 【{"k1": "a\"b'c"}
结果就是在JS赋值时出现错误:
var str = '&?php echo $?&' ;
var str = "&?php echo $?&" ;
// 无论外层是用单引号还是双引号都会出错
最后写了个函数单独替换引号为unicode字符:
* 把单引号双引号编码为unicode 格式以便直接把json字符串赋值给js变量
* 若引号经过htmlspecial/htmlentities编码则必须htmlspecialchars_decode($str) 否则无法正确替换
* 在json_encode()之后执行,确保双引号最终编码成 \\u0022,
* 从而在JS赋值时为 \"
$val = escapeQuotes(json_encode($arr)) ;
var str = '&?php echo $?&' ;
// 外层必须套有引号
var obj = $.parseJSON(str);
function escapeQuotes($str) {
if ($str && is_string($str)) {
$str = str_replace("'",
"\u0027", $str);
$str = str_replace('"',
"\u0022", $str);
用法如下:
// 从数据库获得, 数值在入库前经过 htmlspecialchars($str, ENT_QUTOES) 编码过
// 或者不经过htmlspecialchars编码,下面也无需解码
$arr = array(
'k1' =& htmlspecialchars_decode($v1, ENT_QUOTES),
'k2' =& htmlspecialchars_decode($v2, ENT_QUOTES),
$str = escapeQuotes(json_encode($arr));
var tt = jQuery.parseJSON('&?php echo $?&');
// 外层也可用双引号
代码简单,但搞清楚前后台、PHP/HTML/JS 编码解码规律着实费了一番功夫。在此与大家分享。
想起了一个更好的办法来解决:在确保变量所有字符是实体(htmlspecialchars_decode())情况下,先对此变量进行json_code()编码然后执行 addslashes
() 给引号加上转义反斜杠即可,
此时字符串类似 【{"k1": "a\\\"b\'c"}
】,两层转义供两层输出转换。
// 从数据库获得, 数值在入库前经过 htmlspecialchars($str) 编码过
$arr = array('k1' =& htmlspecialchars_decode($v1));
$str = addslashes(json_encode($arr));
var tt = jQuery.parseJSON('&?php echo $?&');
浏览 11115
本身就完整的js值。至于你的数据问题,我怀疑是数据库里面的数据多余的被先转义了一次,等取回的时候又要多一次转义,凭增烦恼。测试数据是直接写在PHP中而不是从数据库取出来的。数据是由“数组”转换出,在前台赋值后是js对象而不是简单的数字或者字符串你可以试试看返回带有特殊符号的字符串给前台,比如
echo json_encode(array('k1'=&'a\'b"c'))
var tt = jQuery.parseJSON('&?php echo $?&');
后应该是 tt.k1 = a'b"c& 这样的结果。
浏览: 173422 次
很棒,但如果能把安装环节加进去就完美了。
怎样让下拉列表自动加入滚动条
silentu 写道感谢博主分享,不过我发现在demo12中不 ...
silentu 写道感谢博主分享,不过我发现在demo12中不 ...
pmaojie1 写道请问如何自定义排序,好像默认是按key从 ...JSON简介 - Hello_zihan的博客 - CSDN博客
Ajax和Json
1、JSON是一种数据格式,不支持变量、函数和对象实例,可以表示以下三种类型的值:
简单值:使用与Javascript相同的语法,可以在JSON中表示字符串、数值、布尔值、和null,不支持undefine。
对 & &象:表示一组无序的键值对,每个键值对中的值可以是简单值,也可以是复杂数据类型的值。
数 & &组:表示一组有序的键值列表,可以通过数值索引来访问其中的值,数组的值也可以是任意类型——简单值、对象和数组。
2、简单值:
这是JSON表示数值5的方式,类似地,字符串表示:&Hello world!&。Javascript字符串与JSON字符串最大的区别在于,JSON字符串必须使用双引号(单引号会导致语法错误),布尔值和null也是有效的JSON的形式。
JSON中的对象与Javascript有点不同。javascript中如下:
var &person = {
name: &&Nicholas&,
实际上,javascript中完全可以这样写:
var &person = {
&name&: &&Nicholas&,
&age&: &29
JSON表示上述对象方式如下:
&name&: &&Nicholas&,
&age&: &29
} //与javascript相比,末尾没有分号,没有声明变量(JSON中没有变量的概念)。并且JSON中对象的属性名任何时候都必须加双引号
也可以在对象中嵌入对象:
&name&: &&Nicholas&,
&age&: &29,
&school&: {
&name&: &collegeName&,
&location&:
&locationName&
虽有有两个name,但同属于不同的对象,因此这样没问题。不过同一对象中绝对不应该出现两个同名属性。
Javascript中数组字面量如下:
var value = [25, &hi&, true];
在JSON中同样的语法如下:[25, &hi&, true],结尾也没有分号。
5、解析与序列化:
早期的JSON解析器基本上使用Javascript的eval()函数,可以解析、解释并返回Javascript对象和数组。ECMAscript5对解析JSON行为进行了规
范,定义了全局对象JSON。在旧版本浏览器中,使用eval()对JSON数据结构求值存在风险,因为可能会执行一些恶意代码。
JSON对象有两个方法:stringify()和parse()。在简单的情况下,这两个方法分别用于把javascript对象序列化为JSON字符串和把JSON字符串解
析为原生的javascript值。有时候JSON.stringify()不能满足对某些对象进行自定义序列化的需求,在这种情况下可以给对象定义toJSON()方法,
返回其自身的JSON格式。
参考自《JavaScript高级程序设计》
我的热门文章
即使是一小步也想与你分享问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
有一个JSON格式的变量userinfo
var userinfo = {
"USERNAME"
"DEVICEID"
然后还有一个字符串变量data的内容{"USERNAME":"abc","EMAIL":"","SALT":"b9L7RqfCAIeJ72R1q8pqru3ZyZJJ6VCpyV/YBdIjMDbnGx5UwtnO7+883Q0e2kSoji25/L4NK4ZSebrBYjBifdd7Jn9VJDDLYu0sA76LgmMGswp6zzAEosFa3AHMUh0lNStf+8K3OhvPA1ER3IfjJN0Y33u14cYdLxGshCinT4I=","HASH":"+b5cNtArzhKJAZEegaIE/DtTRC+dRP0bjydOhGiyJptMYoTw9pPyjIKpZWMGNp9PK7MI1TKidq03wCr3jFeAisP2nMXRmsZFmhTLhzgtrGsxFomz0cZiEtqqSNiBkXiPtr/V7mwgiXqFbxf3om17CP9diR+1enjY2Br6zBoaq8A=","DEVICEID":"","TOKIN":"FA3BA2A33E8"}
我想把data的内容放到userinfo的对应位置上,该怎么做?
data里面的内容是之前把这个userinfo保存成的字符串。
或者换句话说我现在想用USERNAME字段的内容,改怎么用呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var jsonn = '{"USERNAME":"abc","EMAIL":"","SALT":"b9L7RqfCAIeJ72R1q8pqru3ZyZJJ6VCpyV/YBdIjMDbnGx5UwtnO7+883Q0e2kSoji25/L4NK4ZSebrBYjBifdd7Jn9VJDDLYu0sA76LgmMGswp6zzAEosFa3AHMUh0lNStf+8K3OhvPA1ER3IfjJN0Y33u14cYdLxGshCinT4I=","HASH":"+b5cNtArzhKJAZEegaIE/DtTRC+dRP0bjydOhGiyJptMYoTw9pPyjIKpZWMGNp9PK7MI1TKidq03wCr3jFeAisP2nMXRmsZFmhTLhzgtrGsxFomz0cZiEtqqSNiBkXiPtr/V7mwgiXqFbxf3om17CP9diR+1enjY2Br6zBoaq8A=","DEVICEID":"","TOKIN":"FA3BA2A33E8"}';
var userinfo = JSON.parse(jsonn);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
for(x in userinfo){
if(data[x]){
userinfo[x] = data[x];
console.log(userinfo['USERNAME']);
是这样的么?
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App

我要回帖

更多关于 json字符串中加入变量 的文章

 

随机推荐