ios — Проблемы с извлечением JSON с PHP-сервера с использованием Alamofire

Когда я отправляю массив, я получаю неправильный JSON на сервере:

Клиентский объект:

class Dummy : Mappable {
var test1 = "test1";
var test2 = "test2";

func mapping(map: Map) {
test1 <= map["test1"]
test2 <= map["test2"]
}
required init(){}
}

Клиент звонит:

let wrongDummies : [Dummy] = [Dummy(), Dummy()];
let wrongDummiesJSONArray = Mapper().toJSONArray(wrongDummies)
let dummies : [String:AnyObject] = [

"right": Mapper().toJSON(Dummy()),

"again_right": ["dummy1" : Mapper().toJSON(Dummy()), "dummy2" : Mapper().toJSON(Dummy())],

"wrong": [Mapper().toJSON(Dummy()), Mapper().toJSON(Dummy())],

"again_wrong": wrongDummiesJSONArray

]
println(dummies)
request(.POST, PROFILE_URL, parameters: dummies)

Печать клиента (который кажется нормальным):

[right: {
test1 = test1;
test2 = test2;
}, wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
), again_right: {
dummy1 =     {
test1 = test1;
test2 = test2;
};
dummy2 =     {
test1 = test1;
test2 = test2;
};
}, again_wrong: (
{
test1 = test1;
test2 = test2;
},
{
test1 = test1;
test2 = test2;
}
)]

Реализация сервера (PHP):

ini_set("log_errors", 1);
ini_set("error_log", "$root/php-error.log");
error_log(print_r($_POST, true));

Сервер ответов:

Array
(
[again_right] => Array
(
[dummy2] => Array
(
[test2] => test2
[test1] => test1
)

[dummy1] => Array
(
[test2] => test2
[test1] => test1
)

)

[again_wrong] => Array
(
[0] => Array
(
[test2] => test2
)

[1] => Array
(
[test1] => test1
)

[2] => Array
(
[test2] => test2
)

[3] => Array
(
[test1] => test1
)

)

[right] => Array
(
[test2] => test2
[test1] => test1
)

[wrong] => Array
(
[0] => Array
(
[test2] => test2
)

[1] => Array
(
[test1] => test1
)

[2] => Array
(
[test2] => test2
)

[3] => Array
(
[test1] => test1
)

)

)

Как видите, объекты внутри массива разделены по количеству их атрибутов, чего не происходит с объектами внутри словаря.

0

Решение

В ваших журналах мы видим данные со стороны iOS и PHP, но мы не можем точно сказать, что на самом деле передается. Мы должны посмотреть, с какой стороны на самом деле происходит проблема, поэтому посмотрим, сможете ли вы распечатать фактический отправляемый HTTP-запрос. Если JSON неверен, то сторона iOS неверна, в противном случае PHP читает его неправильно.

Сначала убедитесь, что вы отправляете свои параметры в виде JSON на сервер. Alamofire по умолчанию будет использовать URL-кодировку по умолчанию, если вы не укажете, что хотите JSON.

Затем, похоже, вы распечатываете $_POST Это указывает на то, что вы, вероятно, отправляете данные в виде параметров в кодировке URL, а не в формате JSON. Это могло бы напортачить.

Если Аламофир является отправив данные как JSON, и вы не получите данных на сервере, а затем убедитесь, что вы изменили их, чтобы прочитать тело HTTP с данными JSON в нем:

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE );

Я думаю, что это должно охватывать ваши базы, или, по крайней мере, дать вам хорошее представление о том, где искать 🙂

2

Другие решения

Других решений пока нет …