За последние 24 часа нас посетили 101260 программистов и 5624 робота. Сейчас ищут 1873 программиста ...

Строка JSON UTF-8 не могу распарсить

Тема в разделе "PHP для новичков", создана пользователем ageMLex, 11 дек 2017.

  1. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Я часто люблю рассказывать анекдот про человека, который, ночью, потерял ключи по дороге домой, но ищет их под фонарем у подъезда. Потому что там светлее. Не будьте этим человеком. Я же ясно обозначил, в чем проблема. Прям вот яснее некуда. Зачем усложнять? Зачем эти HEX-ы, зачем догадки с заголовками и кодировками, если это все тут не при чем? Ну не при чем же :)
    --- Добавлено ---
    Выкиньте из середины лишнее. Там же однотипные записи идут все равно. Оставьте штучек 5-6 их. А остальное не трогайте, копируйте как есть.
     
  2. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    HTML:
    1. 'ÿþ[' . "\0" . '
    2. ' . "\0" . '
    3. ' . "\0" . '    ' . "\0" . '\'' . "\0" . '{' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '-B>@C??0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . 't' . "\0" . 'r' . "\0" . 'u' . "\0" . 'e' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '1' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '">20@K\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . ' >48B5;L\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85>;=>5\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" '#?;>B=8B5;L ' . "\0" . '=0?>;L=K9 ' . "\0" . 'S' . "\0" . ' ' . "\0" . '7' . "\0" . '6' . "\0" . '3' . "\0" . '9' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '4' . "\0" . '1' . "\0" . '3' . "\0" . '9' . "\0" . '7' . "\0" . '7' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;>AB02I8:0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '4' . "\0" . '1' . "\0" . '3' . "\0" . '9' . "\0" . '7' . "\0" . '7' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '48=8F008<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . 'HB\\' . "\0" . '"' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '}' . "\0" . '\'' . "\0" . '
    4. ' . "\0" . '
    5. ' . "\0" . ']' . "\0" . ''
     
  3. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    Странный вид строки, не правда ли?
    --- Добавлено ---
    надеюсь этот раз правильно код сделал и скопировал строку из браузера?
    PHP:
    1. <?php
    2. $txt = file_get_contents("http://login:password@msbws01.meesenburg.kz/msb_test_utp/hs/OnlineStore/Products");
    3.   echo (var_export($txt));
    4. ?>
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    тошнит от прочтенного
     
  5. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    А кроме того, что тошнит, есть мысли и комментарии по теме, которые помогут решить простую для профи, но сложную для новичка задачу?
    --- Добавлено ---
    Так вроде же всё сделал, что просили? Ну и что что дополнительно попробовал заголовок подсунуть. Я же и без него сделал. А там кроме хексов и символы есть в отдельной колонке. Кроме того скопировал из браузера в отдельном посте то, что получилось в результате. Начало взял и конец. Середину обрезал. Или в php сообществе слова имеют другую симантику. Ну так дайте мапинг на слова, усвою, буду понимать. А может у вас есть тут другая ветка? Для тех, кто туго соображает. Надо, я и туда напишу вопрос, мне не сложно, мне результат нужен. Сори за вышесказанное, но хоть убейте, не врубаюсь, чего не сделал, а нужно было сделать?
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    этот результат от кода:
    PHP:
    1. <?php
    2.  
    3. $txt = file_get_contents ( 'http://login:password@msbws01.meesenburg.kz/msb_test_utp/hs/OnlineStore/Products' );
    4.  
    5. var_export ( $txt );
    или с заголовком дополнительно ?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Смущает конкатенация. Не должно ее там быть. Такое чувство, что сервер генерит на JSON-строку, а php_код под eval. Наличие BOM тоже как бы намекает на это.
    --- Добавлено ---
    Плюс, строка битая. Что это за мусор в ней: '#?;>B=8B5;L ' без конкатенации, ломающий ее?
    --- Добавлено ---
    Крч это очень странно и не похоже на то, что в первом посте. Как так?
     
  8. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    Завтра точно скажу. +перепроверю себя
    --- Добавлено ---
    Генерация происходит средствами 1с бухгалтерия. Завтра поговорю с программистом, который это делал. Попытаюсь понять стандартными средствами системы он делал или сам что то мастерил. Отпишусь.
     
  9. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    Вот это выходит в браузере:
    HTML:
    1. 'ÿþ[' . "\0" . '
    2. ' . "\0" . '
    3. ' . "\0" . '    ' . "\0" . '\'' . "\0" . '{' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '-B>@C??0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . 't' . "\0" . 'r' . "\0" . 'u' . "\0" . 'e' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '1' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '">20@K\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . ' >48B5;L\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85>;=>5\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;>AB02I8:0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '48=8F008<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '}' . "\0" . '\'' . "\0" . ',' . "\0" . '
    4. ' . "\0" . '    ' . "\0" . '\'' . "\0" . '{' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '-B>@C??0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . 'f' . "\0" . 'a' . "\0" . 'l' . "\0" . 's' . "\0" . 'e' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '2' . "\0" . '1' . "\0" . '6' . "\0" . '3' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '#?;>B=8B5;L ' . "\0" . '=0?>;L=K9 ' . "\0" . 'S' . "\0" . ' ' . "\0" . '7' . "\0" . '6' . "\0" . '3' . "\0" . '9' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . ' >48B5;L\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '0' . "\0" . '1' . "\0" . '8' . "\0" . '3' . "\0" . '2' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '08<5=>20=85>;=>5\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '#?;>B=8B5;L ' . "\0" . '=0?>;L=K9 ' . "\0" . 'S' . "\0" . ' ' . "\0" . '7' . "\0" . '6' . "\0" . '3' . "\0" . '9' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '4' . "\0" . '1' . "\0" . '3' . "\0" . '9' . "\0" . '7' . "\0" . '7' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '@B8:C;>AB02I8:0\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . '4' . "\0" . '1' . "\0" . '3' . "\0" . '9' . "\0" . '7' . "\0" . '7' . "\0" . '\\' . "\0" . '"' . "\0" . ',' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '\\' . "\0" . '"' . "\0" . '48=8F008<5=>20=85\\' . "\0" . '"' . "\0" . ':' . "\0" . ' ' . "\0" . '\\' . "\0" . '"' . "\0" . 'HB\\' . "\0" . '"' . "\0" . '\\' . "\0" . 'r' . "\0" . '\\' . "\0" . 'n' . "\0" . '}' . "\0" . '\'' . "\0" . '
    5. ' . "\0" . '
    6. ' . "\0" . ']' . "\0" . ''
    Всего 4329 строк такой ерунды.

    Код при этом не содержит ничего лишнего, в том числе не файла .htaccess, всё выполняется на локальном сервере Endels:
    PHP:
    1. <?php
    2.   $txt = file_get_contents("http://login:password@msbws01.meesenburg.kz/msb_test_utp/hs/OnlineStore/Products");
    3.   echo (var_export($txt));
    4. ?>
    C 1C программистом получится поговорить позже, отпишусь...
     
  10. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    Ну вот собственно я и нашёл ответ на свой вопрос:
    http://1с-интеграция.рф/useful_links/49/375/ в конце статьи есть пример для json.

    Вот PHP часть:
    PHP:
    1. <?php
    2. // 1. Получим строковые данные из входящего файла
    3. $json_filedata = file_get_contents('php://input');
    4. // 2. Отрежем все лишнее (добавляются 2 служебных символа), что // мешает преобразованию из JSON
    5. $jsData = trim(ltrim($json_filedata));
    6. $dlinaStr = strlen($jsData);
    7. $_jsData = '';
    8. $i=1;
    9. while ($i<$dlinaStr) {
    10. if ($i>2) {
    11. $_jsData = $_jsData.substr($jsData, $i, 1);
    12. }
    13. $i++;
    14. }
    15. // 3. Преобразуем данные из JSON в объект (структуру)
    16. $mData = json_decode($_jsData);
    17. // 4. Сформируем другую структуру, которую заполним данными и // вернем в 1С
    18. class returnData {
    19. var $v1;
    20. var $v2;
    21. }
    22. $sReturnData = new returnData;
    23. $sReturnData->v1 = $mData->param1;
    24. $sReturnData->v2 = $mData->param2;
    25. // 5. Преобразуем данные структуры в JSON строку
    26. $json_returnData = json_encode($sReturnData);
    27. // 6. Вернем данные в 1С (выводимые данные будут перенаправлены в файл, который и вернется в 1С)
    28. echo $json_returnData;
    29. ?>
    Обратите внимание, как они отрезают первые 2-а символа. Режут по одному символу и складывают в новую строку. Лично у меня такой способ не работает. Вылетает по таймауту - ответ то у меня огого какой длинный. Переделывал, чтобы отрезало сразу всё встроенными функциями, не помогает... Одна надежда, что 1С программист реализовал механизм каким то своим способом. Тогда впереди переделка его сервиса и попытка заново преобразовать json.

    Отсюда я делаю вывод, что:
    1. Нужно показать эту ссылку 1С программисту. Так ли он делал.
    2. Для взаимодействия с PHP использовать не такой экзотический способ, а стандартную публикацию rest-сервиса, поддерживаемую 1С и более современную. Данный способ прекрасно работает. Проверял из Sharepoint (встроенными средствами) без использования C#, из JavaScript.

    Приведу свой пример одной функции из JS (с вкраплениями ASPX), но тоже самое, если преобразовать, естественно будет работать и для PHP.

    Код (Javascript):
    1. function sec() {
    2.         var xhttp = new XMLHttpRequest();
    3.  
    4.         var sURL = "/_vti_bin/DogovorService/DogovorService.svc/GetChatByDogovorId/<%= dogID.Value %>/" + document.getElementById("<%= lastTime.ClientID %>").value + "?_=" + new Date().getTime(); // Добавляем время для удаления эффекта кэша
    5.         xhttp.open("GET", sURL, false);
    6.         xhttp.setRequestHeader("Content-type", "text/plain");
    7.         xhttp.withCredentials = true;
    8.         xhttp.send();
    9.         var response = JSON.parse(xhttp.responseText);
    10.         var post = response.lastPosts;
    11.         post = post.replace(/\n/g, "<br />");
    12.         document.getElementById("<%= ChatBox.ClientID %>").innerHTML = post + document.getElementById("<%= ChatBox.ClientID %>").innerHTML;
    13.         var T = response.lastTime;  
    14.         var sLastTime = T.substring(0, 2) + T.substring(3, 5) + T.substring(6, 10) + T.substring(11, 13) + T.substring(14, 16) + T.substring(17, 19);
    15.         document.getElementById("<%= lastTime.ClientID %>").value = sLastTime;
    16.     }
    Всем спасибо, кто помогал. Всё же вопросы связанные с взаимодействием с 1С, нужно смотреть на профильных сайтах, уж больно специфичны реализации стандартных вещей бывают, как оказалось.
     
  11. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    А ответ мы ранее видели в выводе как json, поскольку, как правильно заметил Fell-x27, 1С формирует строку для eval, но только наверно не для PHP (хотя конкатенация php-шная, но может JS отсылает строку PHP :eek:), а для JavaScript. JS выполняется на стороне клиента в браузере, мы получаем json c BOM. Видно, что перед выводом eval как раз есть 2-а лишних символа, которые предположительно и удаляются в найденном на сайте скрипте.
     
    #36 ageMLex, 13 дек 2017
    Последнее редактирование: 13 дек 2017
  12. ageMLex

    ageMLex Новичок

    С нами с:
    11 дек 2017
    Сообщения:
    24
    Симпатии:
    0
    Подключился к локальной 1С, которая публикует Rest сервис при помощи PHP кода:
    PHP:
    1. <?php
    2.   $username = "username";
    3.   $password = "pssword";
    4.   $remote_url = 'http://Внутренний_IP/myrest/odata/standard.odata/Catalog_АктуальныеСотрудники?$format=json';
    5.   $opts = array(
    6.       'http'=>array(
    7.         'method'=>"GET",
    8.         'header' => "Authorization: Basic " . base64_encode("$username:$password")              
    9.       )
    10.   );
    11.   $context = stream_context_create($opts);
    12.   $file = file_get_contents($remote_url, false, $context);
    13.   $txt = json_decode ($file, true);
    14.   foreach ($txt as $key => $value)
    15.     echo($value);
    16. ?>
    REST рулит! Никаких головников.

    Вывод в браузере:
    HTML:
    1. http://ВнутреннийIP/myrest/odata/standard.odata/$metadata#Catalog_АктуальныеСотрудникиArray
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Господи, какие костыли, господи, какая дичь :(
    Зачем?
    2014 год. Документация по 1С v8. Формирование/чтение нормального человеческого JSON встроенными методами.
    Нахрена эти вот костыли было городить? Можно ведь просто почитать документацию.
     
  14. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Оффтоп.
    Когда-то почитать "просто" не получилось. Меня в депрессию вгоняет их Excel-подобный код :)
    Код (Text):
    1.  
    2. Для каждого А из Б Цикл
    3.   // ...
    4. КонецЦикла;
    5. // или
    6. Массив = Новый Массив;
    --- Добавлено ---
    P.S. Сейчас обратил внимание, что код у них в документации выложен в скринах. Наверно это их коллеги изредка заходят на форум проконсультироваться? ))