case '<':
if (オプション & PHP_JSON_HEX_TAG) {
Smart_str_appendl(buf, "\u003C", 6);
} else {
Smart_str_appendc(buf, '<');
}
休憩。
case '>':
if (オプション & PHP_JSON_HEX_TAG) {
Smart_str_appendl(buf, "\u003E", 6);
} else {
Smart_str_appendc(buf, '>');
}
休憩。
ケース '&':
if (オプション & PHP_JSON_HEX_AMP) {
Smart_str_appendl(buf, "\u0026", 6);
} else {
Smart_str_appendc(buf, '&');
}
休憩。
ケース「」:
if (オプション & PHP_JSON_HEX_APOS) {
Smart_str_appendl(buf, "\u0027", 6);
} else {
Smart_str_appendc(buf, '');
}
休憩。
デフォルト: //一直到这里、没特殊字符就会把值appendtobuf中
if (us >= ' ' && (us & 127) == us) {
Smart_str_appendc(buf, (unsigned char) us);
} else {
Smart_str_appendl(buf, "\u", 2);
us = REVERSE16(us);
smart_str_appendc(buf、digits [us&((1&lt;&lt; 4)-1)]);
私たち>>= 4;
smart_str_appendc(buf、digits [us&((1&lt;&lt; 4)-1)]);
私たち>>= 4;
smart_str_appendc(buf、digits [us&((1&lt;&lt; 4)-1)]);
私たち>>= 4;
smart_str_appendc(buf、digits [us&((1&lt;&lt; 4)-1)]);
}
休憩。
}
}
smart_str_appendc(buf, '"'); // 二重引き号を終了します。
efree(utf16);
}
再来看看数组和对象,また很简单,
static void json_encode_array(smart_str *buf, zval **val, int options TSRMLS_DC) /* {{{ */
{
int i, r;
ハッシュテーブル *myht;
if (Z_TYPE_PP(val) == IS_ARRAY) {
myht = HASH_OF(*val);
r = (オプション & PHP_JSON_FORCE_OBJECT) ? PHP_JSON_OUTPUT_OBJECT : json_determine_array_type(val TSRMLS_CC);
} else {
myht = Z_OBJPROP_PP(val);
r = PHP_JSON_OUTPUT_OBJECT;
}
if (myht && myht->nApplyCount > 1) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "再帰が検出されました");
smart_str_appendl(buf, "null", 4);
戻る;
}
//开始标签
if (r == PHP_JSON_OUTPUT_ARRAY) {
smart_str_appendc(buf, '[');
} else {
smart_str_appendc(buf, '{');
}
i = myht ? zend_hash_num_elements(myht) : 0;
if (i > 0)
{
char *key;
zval **データ;
ulong インデックス。
uint key_len;
HashPosition pos;
ハッシュテーブル *tmp_ht;
int need_comma = 0;
zend_hash_internal_pointer_reset_ex(myht, &pos);
//便利哈希表
for (;; zend_hash_move_forward_ex(myht, &pos)) {
i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos);
if (i == HASH_KEY_NON_EXISTANT)
休憩。
if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) == SUCCESS) {
tmp_ht = HASH_OF(*data);
if (tmp_ht) {
tmp_ht->nApplyCount++;
}
if (r == PHP_JSON_OUTPUT_ARRAY) {
if (need_comma) {
Smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
//将值buf中に追加します
php_json_encode(buf, *data, options TSRMLS_CC);
} else if (r == PHP_JSON_OUTPUT_OBJECT) {
if (i == HASH_KEY_IS_STRING) {
if (key[0] == ' ' && Z_TYPE_PP(val) == IS_OBJECT) {
/* 保護されたメンバーと非公開メンバーをスキップします。 */
if(tmp_ht){
tmp_ht->nApplyCount--;
}
続けます。
}
if (need_comma) {
Smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
json_escape_string(buf, key, key_len - 1, options & ~PHP_JSON_NUMERIC_CHECK TSRMLS_CC);
Smart_str_appendc(buf, ':');
php_json_encode(buf, *data, options TSRMLS_CC);
} else {
if (need_comma) {
Smart_str_appendc(buf, ',');
} else {
need_comma = 1;
}
Smart_str_appendc(buf, '"');
Smart_str_appendc(buf, '"');
Smart_str_appendc(buf, ':');
php_json_encode(buf, *data, options TSRMLS_CC);
}
}
}
}
//終了タグ
if (r == PHP_JSON_OUTPUT_ARRAY) {
smart_str_appendc(buf, ']');
} else {
smart_str_appendc(buf, '}');
}
}
簡単な分析を通じて、問題は実際には上記の sprintf を使用した方法と同じであることが証明されました。つまり、文字列を結合します。
http://www.bkjia.com/PHPjc/477721.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/477721.html技術記事 json の利点については話しません。私は json を出力するときに sprintf を使用して json 形式に変換するのが好きです。2 日前、私の友人はそれが標準ではないと言っていました。 json_encode によって標準化されます...