PHP json_encode возвращает ноль

1

Привет, я пытаюсь использовать php для доступа к моей базе данных из приложения Swift, которое я кодирую. Пока чтение таблиц идет отлично, но теперь я пытаюсь прочитать таблицу с несколькими строками, содержащими json. Это порождает ошибки, и я не могу получить конечный результат равным тому, что я хочу, или что-нибудь, что работает с быстрым кодом. Первоначально json выводил как null. Изучив, как исправить это, я попробовал utf8_encode(), но это дало слишком много дополнительных символов, а код Swift в приложении не мог понять. Когда вы выводите только одну из строк, она получается прекрасной, ее, когда я пытаюсь помещать их в один ассоциативный массив, чтобы поставить его как json, когда они появляются как null.

Код PHP:

$sql = "Select * FROM User WHERE  Id = '".$UserId."' LIMIT 1";
mysql_select_db($database, $User);
$result = mysql_query($sql , $User) or die(mysql_error());
$FleetRaw = mysql_fetch_assoc($result);




$Fleet1 = $FleetRaw['Fleet1'];
$Fleet2 = $FleetRaw['Fleet2'];
$Fleet3 = $FleetRaw['Fleet3'];
$Fleet4 = $FleetRaw['Fleet4'];
$Fleet5 = $FleetRaw['Fleet5'];
$Fleet6 = $FleetRaw['Fleet6'];




$Fleets = array("1"=>$Fleet1,"2"=>$Fleet2,"3"=>$Fleet3,"4"=>$Fleet4,"5"=>$Fleet5,"6"=>$Fleet6);

//Output 1
echo $Fleets["1"]."<br><br><br>";
//Output 2
echo json_encode(utf8_encode($Fleets["1"]))."<br><br><br>";
//Output 3
echo json_encode($Fleets);

?>

Выходы:

Output 1:
    { "status" : 3, "game" : 0, "ships" : { "1" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 100 }, "3" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : -100 }, "2" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 0 }, "0" : { "level" : 0, "className" : "MotherShip", "posX" : 0, "health" : 100, "posY" : 0 } } }

Output 2:
     "{\n\u0093status\u0094 : 3,\n\u0093game\u0094 : 0,\n\u0093ships\u0094 : {\n \"1\" : {\n \"level\" : 0,\n \"className\" : \"LighteningShip\",\n \"posX\" : 100,\n \"health\" : 50,\n \"posY\" : 100\n },\n \"3\" : {\n \"level\" : 0,\n \"className\" : \"LighteningShip\",\n \"posX\" : 100,\n \"health\" : 50,\n \"posY\" : -100\n },\n \"2\" : {\n \"level\" : 0,\n \"className\" : \"LighteningShip\",\n \"posX\" : 100,\n \"health\" : 50,\n \"posY\" : 0\n },\n \"0\" : {\n \"level\" : 0,\n \"className\" : \"MotherShip\",\n \"posX\" : 0,\n \"health\" : 100,\n \"posY\" : 0\n }\n}\n}"

Output 3:
    {"1":null,"2":null,"3":null,"4":null,"5":null,"6":null}

Результат 1 - это именно тот формат, который я хочу (тот, который понимает Swift), за исключением того, что это только одна из шести строк (также приложение отклоняет эту форму, потому что это не json_encode перед эхом). Результат 2 является примером одной из шести строк, которые при использовании utf8_encode() перед сохранением в массиве дают много дополнительных символов, однако он выводит не равно null, когда помещается в массив из шести. Выход 3 - это то, что я хочу в конечном итоге выводить, просто без нулевого.

Идеальная ситуация заключалась бы в объединении выходов 1 и 3, чтобы я мог выводить массив из шести с ними, похожий на Output 1. Также приложение работало только тогда, когда я json_encode, что я эхо. Если есть кто-то, возможно выполнить это, пожалуйста, дайте мне знать!

Благодарю!!

ближайшая попытка, работая, но удваивая данные?

$Fleet1 = $FleetRaw['Fleet1'];
$Fleet2 = $FleetRaw['Fleet2'];
$Fleet3 = $FleetRaw['Fleet3'];
$Fleet4 = $FleetRaw['Fleet4'];
$Fleet5 = $FleetRaw['Fleet5'];
$Fleet6 = $FleetRaw['Fleet6'];




$Fleets = array("1"=>$Fleet1,"2"=>$Fleet2,"3"=>$Fleet3,"4"=>$Fleet4,"5"=>$Fleet5,"6"=>$Fleet6);
// Convert an array of JSON-Strings to unified array of structured data..

foreach ( $Fleets as $key => $sJSONString ){
     $FleetRaw[$key] = json_decode($sJSONString);
}

// Now return the whole lot as a json-string to the client

header("Content-type: application/json"); // My assumption of your model.. 
print json_encode($Fleets);
  • 0
    Пожалуйста, добавьте форматирование кода в свой вопрос
  • 0
    не говоря уже о том, что заметил их отличные цитаты стиля, чем остальные
Теги:

3 ответа

2
Лучший ответ

Насколько я вижу, есть две проблемы:

Проблема A: Broken JSON в базе данных

Output 1:
{ "status" : 3, "game" : 0, "ships" : { "1" : { ... etc

Эти символы "" не являются законными в JSON... поэтому вы не сможете проанализировать данные, которые у вас есть в вашей базе данных, как JSON. Вам придется заменить их законными "персонажами". Откуда появился JSON?

Проблема B: Смешанная строка и структура

Вы смешиваете JSON-as-a-string (поступающую из базы данных) и структуру данных массива в PHP (массив строк из базы данных), который вы хотите представлять как JSON.

Поэтому, чтобы исправить это, нужно делать что-то вроде:

<?php

    // Convert an array of JSON-Strings to unified array of structured data..

    foreach ( $FleetRaw as $key => $sJSONString ){
         $FleetRaw[$key] = json_decode($sJSONString);
    }

    // Now return the whole lot as a json-string to the client

    header("Content-type: application/json"); // My assumption of your model.. 
    print json_encode($FleetRaw);

?>

То, что это должно выводить, представляет собой массив объектов:

[{ "status" : 3, "game" : 0, "etc" : "..." },{ "status" : 99, "game" : 123, "etc" : "..." },{ "status" : 345, "game" : 456, "etc" : "..." },{ .. }]

Обратите внимание на свои "nulls" и UTF8 (выход 3)

Я бы предположил, что ваши нули вызваны тем, что PHP не смог даже закодировать строки JSON в виде строк, потому что они содержат символы UTF8, поэтому выход 3 показывает нули. Но эти проблемы с кодировкой могут быть просто изворотливыми ", которые у вас есть в вашей базе данных.

Если вы исправите проблему A, вы также можете исправить выход 3. Хотя это не мешает вам решить проблему B. Выход 3 станет массивом ваших JSON-строк (представленных в виде строк, которые просто выглядят как JSON). Выпуск B будет сортировать вас.

Кстати: http://php.net/manual/en/function.json-last-error.php должен помочь вам сузить любые оставшиеся проблемы с вашим исходным JSON, если это не указано.

Надеюсь это поможет! J.

  • 0
    Можете ли вы привести пример того, как должен выглядеть правильный json (выпуск A)
  • 0
    Хорошо, это сработало, Сорта. Я могу читать данные, но по некоторым причинам я получаю двойные данные. Я вставил код, который использовал в своем первоначальном вопросе. Я не смог перебрать $ FleetRaw, как вы предложили, потому что в нем больше столбцов, чем только шесть парков, которые я специально получил
Показать ещё 3 комментария
0

Попробуйте json_decode() в последней строке:

$Fleets["1"] = '{ "status" : 3, "game" : 0, "ships" : { "1" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 100 }, "3" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : -100 }, "2" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 0 }, "0" : { "level" : 0, "className" : "MotherShip", "posX" : 0, "health" : 100, "posY" : 0 } } }';

//Output 1
echo $Fleets["1"]."<br><br><br>";
//Output 2
echo json_encode(utf8_encode($Fleets["1"]))."<br><br><br>";
//Output 3
echo '<pre>';
print_r(json_decode($Fleets["1"]), true);

echo json_decode($Fleets["1"]);

Ваш выход 1 должен быть: -

{ "status" : 3, "game" : 0, "ships" : { "1" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 100 }, "3" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : -100 }, "2" : { "level" : 0, "className" : "LighteningShip", "posX" : 100, "health" : 50, "posY" : 0 }, "0" : { "level" : 0, "className" : "MotherShip", "posX" : 0, "health" : 100, "posY" : 0 } } }

Это может вам помочь.

  • 0
    получено следующее сообщение об ошибке: Предупреждение: json_decode () ожидает, что параметр 1 будет строкой, а массив указан в /GetFleet.php в строке 36
  • 0
    пожалуйста, попробуйте еще раз, я отредактировал код еще раз.
Показать ещё 10 комментариев
0

Я не уверен, но я думаю, что проблема в том, что данные вашего флота уже находятся в формате json. Таким образом, первый выход повторяет то, что вы хотите. На втором выходе вы просто кодируете данные json из Fleets ["1"] в utf8, а затем снова кодируете его в json). Третий выход с той же проблемой, но на этот раз вы просто пытаетесь снова переписать ваши json-данные в json.

Попробуй это:

$Fleet1 = json_decode($FleetRaw['Fleet1']);
$Fleet2 = json_decode($FleetRaw['Fleet2']);
$Fleet3 = json_decode($FleetRaw['Fleet3']);
$Fleet4 = json_decode($FleetRaw['Fleet4']);
$Fleet5 = json_decode($FleetRaw['Fleet5']);
$Fleet6 = json_decode($FleetRaw['Fleet6']);

Вы получаете объекты.

$Fleets = array("1"=>$Fleet1,"2"=>$Fleet2,"3"=>$Fleet3,"4"=>$Fleet4,"5"=>$Fleet5,"6"=>$Fleet6);

Вы получаете массив объектов

echo json_encode($Fleets);

Вы должны получить данные vaild json.

  • 0
    Это определенно может быть! За исключением случаев, когда я пытался, я получаю сообщение об ошибке: Предупреждение: json_decode () ожидает, что параметр 1 будет строкой, массив указан в /GetFleet.php в строке 33
  • 0
    Вы ожидаете только одну строку из mysql_fetch_assoc ($ result) ;? Если нет, вам нужно использовать цикл while.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню