Привет, я пытаюсь использовать 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);
Насколько я вижу, есть две проблемы:
Проблема 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.
Попробуйте 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 } } }
Это может вам помочь.
Я не уверен, но я думаю, что проблема в том, что данные вашего флота уже находятся в формате 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.