Как сгенерировать проход из 2 разных json_encodes

I use this method to generate a pass:

 public function setJSON($JSON) {
    if(json_decode($JSON) !== false) {
        $this->JSON = $JSON;
        return true;
    }
    $this->sError = 'This is not a JSON string.';
    return false;
    }
I call this method to generate pass by:
$pass->setJSON('{
    "passTypeIdentifier": "'.$passTypeID.'",
    "formatVersion": 1,
    ..............
"barcode": {
        "altText" : "'.$alt.'",
        "format" : "PKBarcodeFormatPDF417",
        "message": "Member-Card",
        "messageEncoding": "iso-8859-1",
        "changeMessage" : "This pass now has altText  %@ !"
        },
"locations" : [
    {
      "longitude" : 104.89529371261597,
      "latitude" : 11.576150037278605,
      "relevantText": "CamMob (dis. 1%)"
    },
     .....................
]
    }');
But now I don't write those locations statically and I get those data from database by :
$query5 = mysql_query("select * from company");
    while ($row5 = mysql_fetch_array($query5)){
        $companyName = $row5['relevantTextName'];
        $discount = $row5['relevantTextDiscount'];
        $long = $row5['longitute'];
        $lat = $row5['latitute'];
        $link = $row5['link'];

$location['locations'][] = array("longitute" => $long, "latitute" => $lat, "relevantText" => $companyName." (" . $discount. "%)" ); } $jsonString = json_encode($location) ; error_log("Locations: ".$jsonString,0); $pass->setJSON($jsonString); $pass->setJSON('{ "passTypeIdentifier": "'.$passTypeID.'", "barcode": { "altText" : "'.$alt.'", "format" : "PKBarcodeFormatPDF417", "message": "Member-Card", "messageEncoding": "iso-8859-1", "changeMessage" : "This pass now has altText %@ !" } }');</pre>

Когда я тестирую проход обновления, ошибки нет, но я не вижу проход на экране блокировки, как раньше. Таким образом, это означает, что я еще не включил эти места в перевал. Что мне изменить? Это проблема метода setJSON? Если мне это нравится, как я могу объединить эти 2 json-файла, чтобы они стали вместе?


person malinchhan    schedule 10.05.2013    source источник
comment
Сколько у вас локаций? Помните, что будут отображаться только первые 10. Кроме того, если вы хотите проверить, добавляются ли местоположения в JSON, вы можете изменить расширение файла .pkpass на .zip, чтобы увидеть, что генерирует ваш код, или, в качестве альтернативы, записать JSON в журнал php.   -  person PassKit    schedule 10.05.2013
comment
Если я выберу местоположение из базы данных, как я могу добавить их путем кодирования в уже созданный проход?   -  person malinchhan    schedule 10.05.2013
comment
Я не знаю, как комбинировать разные encode_json!   -  person malinchhan    schedule 10.05.2013
comment
Я пробую это: .............. местоположения: '. $ JsonString.' } ');   -  person malinchhan    schedule 10.05.2013
comment
Затем я получаю эту ошибку: [10-May-2013 04:25:52 Europe / Berlin] Журнал ошибок Passbook: [2013-05-10 09:25:54 +0700] Получить задание передачи (тип передачи pass.cam-mob .passbookpasstest, серийный номер 7, если-изменено-с пятницы, 10 мая 2013 г. 09:14:33 GMT + 7; с URL-адресом веб-службы 192.168.1.202/passesWebserver/webService) обнаружена ошибка: получены недопустимые данные передачи (пропуск не может быть прочитан, потому что он недействителен).   -  person malinchhan    schedule 10.05.2013
comment
Я также пробую это: array_push ($ pass, $ jsonString); // строка 159, но получаю эту ошибку: [10-May-2013 09:53:59 Asia / Phnom_Penh] Предупреждение PHP: array_push () ожидает, что параметр 1 будет массив, объект, указанный в /Applications/MAMP/htdocs/passesWebserver/webService/getPassUpdated.php в строке 159   -  person malinchhan    schedule 10.05.2013


Ответы (1)


Вместо того, чтобы создавать JSON напрямую, сначала создайте массив, а затем преобразуйте его в JSON.

$pass_data = array("passTypeIdentifier" => $passTypeID,
                   "formatVersion" => 1,
                   "barcode" => array (
                                       "altText" => $alt,
                                       "format" => "PKBarcodeFormatPDF417",
                                       "message" => "Member-Card",
                                       "messageEncoding" => "utf-8", // use UTF8 in case you want to encode Khmer or other non ASCII 
                                       "changeMessage" => "This pass now has altText  %@ !"
                                      ), 
                   "locations" => $locationsArray,
                   "organizationName" => "Digi club card",
                   "description" => "Membership card",
                   "logoText" => "Digiclub",
                   "foregroundColor" => "rgb(0,0,0)",
                   "backgroundColor" => "rgb(211,211,211)",
                   "generic" => array (
                            "headerFields" => array(
                                       array ( "key" => "Status",
                                               "label" => " ",
                                               "value" => "Membership card"
                                             ),
                                       ),
                            "primaryFields" => array(
                                       array ( "key" => "Name",
                                               "value" => $memberName,
                                             ),
                                       ),

                            "secondaryFields" => array(
                                      // Secondary Field data
                                       ),

                            "auxiliaryFields" => array(
                                      // Auxiliary Field data
                                       ),

                            "backFields" => array(
                                      // Backfiels Field data
                                       ),
                           )
                    );

Затем преобразуйте массив в JSON:

$pass->setJSON(json_encode($pass_data));
person PassKit    schedule 10.05.2013
comment
Спасибо, я просто тестирую таким образом, но я не записываю все в массив, вместо этого я использую декодирование, но я также встречал некоторые ошибки! - person malinchhan; 10.05.2013
comment
$ dataArray = json_decode ($ data, истина); $ result = array_merge ($ dataArray, $ location); $ String = json_encode ($ результат); error_log (Все данные:. $ String, 0); - person malinchhan; 10.05.2013
comment
[10 мая 2013 г. 10:55:32 Asia / Phnom_Penh] Все данные: {passTypeIdentifier: pass.cam-mob.passbookpasstest, formatVersion: 1, serialNumber: 7, teamIdentifier: 3J29YP53Q5, authenticationToken: Fy7Iiew81JNdsdaG, webServiceURL: http: \ /\/192.168.1.202\/passesWebserver\/webService\/,associatedStoreIdentifiers:[485596906], - person malinchhan; 10.05.2013
comment
ошибка: [10-May-2013 05:55:32 Europe / Berlin] Журнал ошибок Passbook: [2013-05-10 10:55:33 +0700] Получить задачу прохождения (тип прохода pass.cam-mob.passbookpasstest, серийный номер 7, если-изменено-с пятницы, 10 мая 2013 г., 10:10:34 GMT + 7; с URL-адресом веб-службы 192.168.1.202/passesWebserver/webService) обнаружена ошибка: получены недопустимые данные передачи (пропуск не может быть прочитан, потому что он недействителен). - person malinchhan; 10.05.2013
comment
Просто используйте исправленный код выше. Написание JSON, его декодирование и повторное кодирование очень неэффективно. - person PassKit; 10.05.2013
comment
как насчет этого (в barcodeField): message: MemberName:. $ name. ' ID: '. $ ID.' ? - person malinchhan; 10.05.2013
comment
в нем есть как строка, так и переменная! - person malinchhan; 10.05.2013
comment
Я получил эту ошибку после того, как написал, как и вы: [10-May-2013 06:51:11 Europe / Berlin] Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданный ':', ожидая ')' в / Applications / MAMP / htdocs / передаетWebserver / webService / getPassUpdated.php в строке 88 // line88: formatVersion: 1, - person malinchhan; 10.05.2013
comment
но теперь я также получаю эту ошибку: [10-May-2013 07:00:08 Europe / Berlin] Журнал ошибок Passbook: [2013-05-10 12:00:10 +0700] Получить задание передачи (тип передачи pass.cam -mob.passbookpasstest, серийный номер 7, если-изменено-с пятницы, 10 мая 2013 г., 10:10:34 GMT + 7; с URL-адресом веб-службы 192.168.1.202/passesWebserver/webService) обнаружена ошибка: получены недопустимые данные прохода (пропуск не может быть прочитан, потому что он недействителен). - person malinchhan; 10.05.2013
comment
Только что заметил ошибку с вложенными массивами для элементов поля. Попробуйте обновленный код выше. Также посмотрите на выведенный JSON (используйте средство красоты Javascript), чтобы отформатировать его, чтобы увидеть, какая часть массива вызывает ошибку. . - person PassKit; 10.05.2013
comment
раньше я писал: $ pass- ›setJSON ('{......}') и результатом json_encode ($ pass_data) будет {passTypeIdentifier: .........} - person malinchhan; 10.05.2013
comment
поэтому $ pass- ›setJSON (json_encode ($ pass_data)); совпадает с $ pass- ›setJSON ('{.......}'); ? - person malinchhan; 10.05.2013
comment
json_encode($pass_data) выводит строку JSON, поэтому да, она должна иметь тот же эффект, что и передача JSON непосредственно этому методу. Вам следует удалить любые другие вызовы $pass->setJSON, потому что этот метод следует вызывать только один раз. - person PassKit; 10.05.2013
comment
[10 мая 2013 г. 13:20:15 Азия / Phnom_Penh] Все данные: {passTypeIdentifier: pass.cam-mob.passbookpasstest, formatVersion: 1, serialNumber: 7, teamIdentifier: 3J29YP53Q5, authenticationToken: Fy7Iiew81JNdsdaG, webServiceURL: http: \ /\/192.168.1.202\/passesWebserver\/webService\/,associatedStoreIdentifiers:[485596906] ,foregroundColor:rgb(0,0,0),backgroundColor:rgb(230,230,250),logoText:DigiClub,DigiClub,ClubName : Компания Digi, общий: {headerFields: [{key: Status, label:, value: Membership card}], - person malinchhan; 10.05.2013
comment
primaryFields: [{key: Name, label: Name, value: Urina}], secondaryFields: [{key: ID, label: ID участника, значение: 7}, {key: date, label: Just Update On, value: 10 \ / 05 \ / 13, 13:20}], a AdditionalFields: [{key:, label: Power By, value: Yata, changeMessage: Этот проход теперь поддерживается% @!}], - person malinchhan; 10.05.2013
comment
backFields: [{key: partners & Discount, label: Цена скидки от партнеров Digi, значение: - CamMob (1%) \ r \ n long: 104.89529371261597 \ r \ n lat .: 11.576150037278605 \ r \ n- ITC ( 2%) \ r \ n long .: 104.89823341369629 \ r \ n lat .: 11.570705493829758 \ r \ n- Digi (10%) \ r \ n long .: - person malinchhan; 10.05.2013
comment
.............}, {key: terms, label: ПОЛОЖЕНИЯ И УСЛОВИЯ, значение: Держатель этой карты уполномочен получать и использовать преимущества, привилегии, скидки в соответствии с установленными условиями выпущен компанией Digi (DTV STAR Co., Ltd.). \ r \ nДля подробностей: 077 \ / 023 22 77 66 | [email protected] | \ r \ nhttp: \ / \ / www.digi.com.kh \ / digiclub. \ r \ nЭта карта является собственностью Digi. В случае обнаружения верните в любой офис Digi. Он не подлежит передаче и может быть отозван Digi в любое время без предварительного уведомления.}]}, - person malinchhan; 10.05.2013
comment
штрих-код: {altText: asfdf, формат: PKBarcodeFormatPDF417, message: Barcode Message, messageEncoding: utf-8, changeMessage: теперь у этого прохода есть altText% @!}, местоположения: - person malinchhan; 10.05.2013
comment
[{длинный текст: 104.89529371261597, широта: 11.576150037278605, релевантный текст: CamMob (1%)}, ​​{длинный текст: 104.89823341369629, широта: 11.570705493829758, релевантный текст: ITC (2%)}, ............. ..., {longitute: 104.89523202180862, latitute: 11.569042154169637, релевантный текст: EZECOM (30,35%)}]} - person malinchhan; 10.05.2013
comment
Если вы хотите опубликовать много кода, используйте pastebin.com (например, pastebin.com/T4ana3Et - person PassKit; 10.05.2013