GM_pAnda
@GM_pAnda
Бездельник

Убрать в JSON ответе кавычки в кавычках?

Доброго времени суток дорогие пользователи! Получаю ответ с чужого сервера в JSON и ответ приходит не валидный из-за того что ты в ответе приходят кавычки лишние. Как их убрать с помощью регулярки?
Вот JSON
{"status": "success","history": [{"tx":"5204759","status":"SUCCESS","date":"04.07.2017","time":"21:53:27","cash":"10,00руб.","orig":"7 000,00руб.","provider":"WebmoneyОАОБанк"ККБ"","opnum":"R14702331","comment":""},{"tx":"5204759","status":"SUCCESS","date":"04.07.2017","time":"21:53:27","cash":"10,00руб.","orig":"7 000,00руб.","provider":"WebmoneyОАОБанк"ККБ"","opnum":"R14702331","comment":""}]}

Как видите, в provider приходит ещё имя банка и там оно обёрнуто в кавычки, нужно мне как-то удалить кавычки, которые в других кавычках. str_replace не помогает!
---------------------------------
PS: Всем спасибо кто остался неравнодушен был к данному вопросу! Спустя сутки, мне ответили разработчики API, и сообщили что они исправили эту ошибку на сервере :)
  • Вопрос задан
  • 2467 просмотров
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
Разве не работает вот так?
$result = str_replace($json_string, "WebmoneyОАОБанк\"ККБ\"","WebmoneyОАОБанк'ККБ'");

Вообще, это нехорошо на чужом сервере... регуляркой такое лучше не трогать. Если они позволяют возвращать кавычки внутри имени, то могут вернуть что-то и с одной, и двумя и тремя.
Ответ написан
BoShurik
@BoShurik
Symfony developer
Сделал на коленке конкретно под ваш пример. Но, думаю, понятно в какую сторону копать
composer req seld/jsonlint

#!/usr/bin/env php
<?php
use Seld\JsonLint\JsonParser;
use Seld\JsonLint\ParsingException;

require_once __DIR__ . '/../vendor/autoload.php';

$parser = new JsonParser();

$data = file_get_contents(__DIR__ . '/../test.json');

$tries = 0;
do {
    $repeat = false;
    try {
        $parser->parse($data);
    } catch (ParsingException $e) {
        $details = $e->getDetails();
        $start = $details['loc']['first_column'];
        $end = mb_strpos($data, ',', $start, 'utf8') - 1;
        $problemString = mb_substr($data, $start, $end - $start, 'utf8');
        $data = str_replace($problemString, addslashes($problemString), $data);
        $repeat = true;
        $tries++;
    }

} while ($repeat);

echo $data;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
проще всего попросить тот сервер сделать по человечески, такой возможно только если там руками собирают JSON.
Ответ написан
GTRxShock
@GTRxShock
SA
echo preg_replace(
    '/(:"[^#:]*?)"([^#:]*?)"([^#:]*?"[,}])/', 
    '$1\'$2\'$3', 
    '{"status": "success","history": [{"tx":"5204759","status":"SUCCESS","date":"04.07.2017","time":"21:53:27","cash":"10,00руб.","orig":"7 000,00руб.","provider":"WebmoneyОАОБанк"ККБ"","opnum":"R14702331","comment":""},{"tx":"5204759","status":"SUCCESS","date":"04.07.2017","time":"21:53:27","cash":"10,00руб.","orig":"7 000,00руб.","provider":"WebmoneyОАОБанк"ККБ"","opnum":"R14702331","comment":""}]}'
);

Можно пропробовать решить в лоб, только потестить надо основательно. И да, я предпочитаю забыть о предложенном решении :D
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы