Пользовательская мета-строка JSON поста WordPress не будет декодироваться с помощью json_decode () - PullRequest
3 голосов
/ 15 июня 2011

У меня проблема с JSON-строкой, извлеченной из пользовательской мета-записи WordPress.

1) Я получаю мета-запись пользовательской записи и сохраняю ее как $json1.

$json1 = get_post_meta(get_the_ID(), 'netr_locations_json', true);

2) Я сохраняю ту же строку, что и $json2, на этот раз жестко закодировано.

$json2 = '{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}';

3) Я повторяю строки.Они идентичны.

echo $json1;
echo $json2;

Результат:

{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}

{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}

4) I var_dump декодированные строки.Строка из WordPress не будет декодироваться и выдает NULL, даже если это та же самая строка.Жестко закодированная строка прекрасно декодирует.

var_dump(json_decode($json1));
var_dump(json_decode($json2));

Результат:

NULL

object(stdClass)#177 (1) { ["locations"]=> array(1) { [0]=> object(stdClass)#173 (6) { ["number"]=> int(1) ["header"]=> string(15) "This is a title" ["desc"]=> string(22) "This is a description." ["address"]=> string(23) "Infinity Loop Cupertino" ["lat"]=> string(10) "37.3322024" ["lng"]=> string(11) "-122.030755" } } } 

Чего мне не хватает?Что не так со строкой из WordPress?


Обновление:

var_dump($json1) дает это:

string(282) "{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}" 

var_dump($json2)дает это:

string(162) "{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}"

Что означает целое число после строки?


Обновление: Это результаты hex_dump():

$ json1:

00 000 22 7B 26 71 75 6F 74 3B 6C 6F 63 61 74 69 6F 6E "{" location
10 016 73 26 71 75 6F 74 3B 3A 5B 7B 26 71 75 6F 74 3B s": [{"
20 032 6E 75 6D 62 65 72 26 71 75 6F 74 3B 3A 31 2C 26 number&q uot;:1,& 
30 048 71 75 6F 74 3B 68 65 61 64 65 72 26 71 75 6F 74 quot;hea der" 
40 064 3B 3A 26 71 75 6F 74 3B 54 68 69 73 20 69 73 20 ;:" This is 
50 080 61 20 74 69 74 6C 65 26 71 75 6F 74 3B 2C 26 71 a title& quot;,&q 
60 096 75 6F 74 3B 64 65 73 63 26 71 75 6F 74 3B 3A 26 uot;desc ":& 
70 112 71 75 6F 74 3B 54 68 69 73 20 69 73 20 61 20 64 quot;Thi s is a d 
80 128 65 73 63 72 69 70 74 69 6F 6E 2E 26 71 75 6F 74 escripti on." 
90 144 3B 2C 26 71 75 6F 74 3B 61 64 64 72 65 73 73 26 ;," address& 
A0 160 71 75 6F 74 3B 3A 26 71 75 6F 74 3B 49 6E 66 69 quot;:&q uot;Infi 
B0 176 6E 69 74 79 20 4C 6F 6F 70 20 43 75 70 65 72 74 nity Loo p Cupert 
C0 192 69 6E 6F 26 71 75 6F 74 3B 2C 26 71 75 6F 74 3B ino" ;," 
D0 208 6C 61 74 26 71 75 6F 74 3B 3A 26 71 75 6F 74 3B lat" ;:" 
E0 224 33 37 2E 33 33 32 32 30 32 34 26 71 75 6F 74 3B 37.33220 24" 
F0 240 2C 26 71 75 6F 74 3B 6C 6E 67 26 71 75 6F 74 3B ,"l ng" 
100 256 3A 26 71 75 6F 74 3B 2D 31 32 32 2E 30 33 30 37 :"- 122.0307 
110 272 35 35 26 71 75 6F 74 3B 7D 5D 7D 22 55" }]}"

$ json2:

00 000 7B 22 6C 6F 63 61 74 69 6F 6E 73 22 3A 5B 7B 22 {"locati ons":[{" 
10 016 6E 75 6D 62 65 72 22 3A 31 2C 22 68 65 61 64 65 number": 1,"heade 
20 032 72 22 3A 22 54 68 69 73 20 69 73 20 61 20 74 69 r":"This is a ti 
30 048 74 6C 65 22 2C 22 64 65 73 63 22 3A 22 54 68 69 tle","de sc":"Thi 
40 064 73 20 69 73 20 61 20 64 65 73 63 72 69 70 74 69 s is a d escripti 
50 080 6F 6E 2E 22 2C 22 61 64 64 72 65 73 73 22 3A 22 on.","ad dress":" 
60 096 49 6E 66 69 6E 69 74 79 20 4C 6F 6F 70 20 43 75 Infinity Loop Cu 
70 112 70 65 72 74 69 6E 6F 22 2C 22 6C 61 74 22 3A 22 pertino" ,"lat":" 
80 128 33 37 2E 33 33 32 32 30 32 34 22 2C 22 6C 6E 67 37.33220 24","lng 
90 144 22 3A 22 2D 31 32 32 2E 30 33 30 37 35 35 22 7D ":"-122. 030755"} 
A0 160 5D 7D ]} 

Так что, очевидно, есть разница.


Это полныйкод:

$json1 = get_post_meta(get_the_ID(), 'netr_locations_json', true);
$json2 = '{"locations":[{"number":1,"header":"This is a title","desc":"This is a description.","address":"Infinity Loop Cupertino","lat":"37.3322024","lng":"-122.030755"}]}';

echo $json1;
echo '<br/><br/>';
echo $json2;
echo '<br/><br/>';

var_dump(json_decode($json1));
echo '<br/><br/>';
var_dump(json_decode($json2));

Спасибо, что взглянули.

Ответы [ 4 ]

2 голосов
/ 15 июня 2011

Использование echo для сравнения строк на самом деле не работает.Я предлагаю вам также сбросить строки в шестнадцатеричные значения.Смотрите здесь для hex_dump php рутины .При этом вы увидите, как они различаются, что может быть удобно для отслеживания проблем кодирования.

json_decode работает только с данными в кодировке UTF-8.Я предполагаю, что данные, которые вы передаете в строку, не будут проверять UTF-8, и поэтому никакие значения не могут быть извлечены.

Прежде чем использовать их, вы должны сначала правильно закодировать данные как UTF-8.Для этого вы должны знать о кодировке данных.

Чтобы проверить, может ли строка быть допустимыми данными UTF-8, я разместил код в вопросе SimpleXML и китайский ,Это функция с именем can_be_valid_utf8_statemachine().

Помимо возможных проблем с кодировкой, при сравнении этих двух значений будьте осторожны при отображении вывода в браузере.Вот еще несколько выводов, совместимых с браузером:

<code>echo '<pre>', htmlspecialchars($json1), '
';echo '
', htmlspecialchars($json2), '
';

Если вы сделаете это со своими строками, оно должно показать вам, где был разбит json в соответствии с выводом hex_dump(), который вы добавили к своему вопросу.

1 голос
/ 15 июня 2011

Возможно, что строка $json1 экранирована ... попробуйте

var_dump(json_decode(stripslashes($json1)));

0 голосов
/ 16 июля 2015

, если полоски не работают, попробуйте str_replace('\\','',$meta_value)

Например: json_decode(str_replace('\\','',get_post_meta( $post->ID, 'google_maps_files', true)),true); worked for me!

0 голосов
/ 06 сентября 2013

попробовать str_replace('\\','',$_POST['you-param']);

...