nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 11:46



Reply to topic  [ 4 posts ] 
Помогите написать парсер json ответа на php 
Author Message
Writer

Joined: 13 Jun 2013 21:48
Posts: 24
Location: г.Зерноград, Ростовская область
Reply with quote
привет всем. Уже не могу, задача вроде простейшая, но уже 2 дня бьюсь, штудирую гугл, и всё никак, так как никогда дела не имел с этим языком, а сейчас вот возникла одна задача. Ну, ближе к делу. Помогите написать парсер ответа в формате json. Поменялась структура ответа от сервера, и теперь скрипт не работает. Проблема только в этом.
В общем, старая структура ответа была наипростейшей, вот такой:
 
Code:
{
  "131": "Парагвай",
  "61": "Португалия",
  "22": "Казахстан",
  "77": "Венесуэла",
  "92": "Босния и Герцеговина",
  "59": "Бразилия",
  "13": "Таиланд",
  "5": "Новая Зеландия",
  "104": "Мальта",
  "51": "Исландия",
  "75": "Кипр",
  "69": "Ливан",
  "81": "Филиппины",
  "57": "Греция",
  "186": "Ангилья",
  "80": "Египет",
  "24": "Германия",
  "54": "Финляндия",
  "62": "Венгрия",
  "56": "Индия",
  "52": "Аргентина",
  "41": "Узбекистан",
  "42": "Молдова",
  "19": "ЮАР",
  "12": "Китай",
  "21": "Нидерланды",
  "23": "Гонконг",
  "97": "Чили",
  "58": "Чехия",
  "60": "Бельгия",
  "79": "Перу",
  "30": "Румыния",
  "84": "Сербия",
  "4": "США",
  "49": "Швеция",
  "48": "Испания",
  "28": "Ирландия",
  "20": "Япония",
  "10": "Швейцария",
  "2": "Беларусь",
  "15": "Канада",
  "16": "Австралия",
  "25": "Южная Корея",
  "71": "Израиль",
  "76": "Сингапур",
  "17": "Польша",
  "50": "Колумбия",
  "31": "Мексика",
  "27": "Австрия",
  "36": "Словакия",
  "107": "Словения",
  "74": "Малайзия",
  "63": "Индонезия",
  "91": "Болгария",
  "94": "Пакистан",
  "1": "Россия",
  "6": "Великобритания",
  "8": "Франция",
  "139": "Марокко",
  "29": "Италия",
  "18": "Дания",
  "55": "Норвегия",
  "32": "Турция",
  "87": "СССР",
  "38": "Киргизия",
  "33": "Украина"
}

и этот ответ обрабатывал кусок кода: (jsonSource - это содержимое json ответа, $sess->countries - это итоговая переменная, которая отдаётся в дальнейшую работу)
Code:
$s = jsonSource
$sess->countries = json_decode( $s, true );

То есть, парсера не было вообще. Переменная уже была в нужном формате просто после функции json_decode(). Как я понимаю, итоговая переменная после этого равна $sess->countries => {131: Парагвай,61: Португалия,22: Казахстан} ну и так далее. Правильно я понимаю?

А теперь формат ответа изменился, теперь он такой:
 
Code:
{
  "result": {
    "131": {
      "title": "Парагвай",
      "code": "PY",
      "phone_code": 595,
      "priority": 1,
      "currency_code": "USD"
    },
    "61": {
      "title": "Португалия",
      "code": "PT",
      "phone_code": 351,
      "priority": 1,
      "currency_code": "EUR"
    },
    "22": {
      "title": "Казахстан",
      "code": "KZ",
      "phone_code": 7,
      "priority": 229,
      "currency_code": "KZT"
    },
    "77": {
      "title": "Венесуэла",
      "code": "VE",
      "phone_code": 58,
      "priority": 1,
      "currency_code": "USD"
    },
    "92": {
      "title": "Босния и Герцеговина",
      "code": "BA",
      "phone_code": 387,
      "priority": 1,
      "currency_code": "EUR"
    },
    "59": {
      "title": "Бразилия",
      "code": "BR",
      "phone_code": null,
      "priority": 227,
      "currency_code": "USD"
    },
    "13": {
      "title": "Таиланд",
      "code": "TH",
      "phone_code": null,
      "priority": 1,
      "currency_code": "USD"
    },
    "5": {
      "title": "Новая Зеландия",
      "code": "NZ",
      "phone_code": 64,
      "priority": 1,
      "currency_code": "USD"
    },
    "104": {
      "title": "Мальта",
      "code": "MT",
      "phone_code": 356,
      "priority": 1,
      "currency_code": "EUR"
    },
    "51": {
      "title": "Исландия",
      "code": "IS",
      "phone_code": 354,
      "priority": 1,
      "currency_code": "EUR"
    },
    "75": {
      "title": "Кипр",
      "code": "CY",
      "phone_code": 357,
      "priority": 1,
      "currency_code": "EUR"
    },
    "69": {
      "title": "Ливан",
      "code": "LB",
      "phone_code": 961,
      "priority": 1,
      "currency_code": "USD"
    },
    "81": {
      "title": "Филиппины",
      "code": "PH",
      "phone_code": 63,
      "priority": 1,
      "currency_code": "USD"
    },
    "57": {
      "title": "Греция",
      "code": "GR",
      "phone_code": 30,
      "priority": 1,
      "currency_code": "EUR"
    },
    "186": {
      "title": "Ангилья",
      "code": "AI",
      "phone_code": null,
      "priority": 1,
      "currency_code": "EUR"
    },
    "80": {
      "title": "Египет",
      "code": "EG",
      "phone_code": 20,
      "priority": 1,
      "currency_code": "USD"
    },
    "24": {
      "title": "Германия",
      "code": "DE",
      "phone_code": 49,
      "priority": 244,
      "currency_code": "EUR"
    },
    "54": {
      "title": "Финляндия",
      "code": "FI",
      "phone_code": 358,
      "priority": 223,
      "currency_code": "EUR"
    },
    "62": {
      "title": "Венгрия",
      "code": "HU",
      "phone_code": 36,
      "priority": 232,
      "currency_code": "EUR"
    },
    "56": {
      "title": "Индия",
      "code": "IN",
      "phone_code": null,
      "priority": 242,
      "currency_code": "USD"
    },
    "52": {
      "title": "Аргентина",
      "code": "AR",
      "phone_code": 54,
      "priority": 234,
      "currency_code": "USD"
    },
    "41": {
      "title": "Узбекистан",
      "code": "UZ",
      "phone_code": 998,
      "priority": 1,
      "currency_code": "USD"
    },
    "42": {
      "title": "Молдова",
      "code": "MD",
      "phone_code": 373,
      "priority": 1,
      "currency_code": "USD"
    },
    "19": {
      "title": "ЮАР",
      "code": "ZA",
      "phone_code": null,
      "priority": 1,
      "currency_code": "USD"
    },
    "12": {
      "title": "Китай",
      "code": "CN",
      "phone_code": null,
      "priority": 235,
      "currency_code": "USD"
    },
    "21": {
      "title": "Нидерланды",
      "code": "NL",
      "phone_code": 31,
      "priority": 1,
      "currency_code": "EUR"
    },
    "23": {
      "title": "Гонконг",
      "code": "HK",
      "phone_code": null,
      "priority": 239,
      "currency_code": "USD"
    },
    "97": {
      "title": "Чили",
      "code": "CL",
      "phone_code": 56,
      "priority": 1,
      "currency_code": "USD"
    },
    "58": {
      "title": "Чехия",
      "code": "CZ",
      "phone_code": 420,
      "priority": 1,
      "currency_code": "EUR"
    },
    "60": {
      "title": "Бельгия",
      "code": "BE",
      "phone_code": 32,
      "priority": 231,
      "currency_code": "EUR"
    },
    "79": {
      "title": "Перу",
      "code": "PE",
      "phone_code": 51,
      "priority": 1,
      "currency_code": "USD"
    },
    "30": {
      "title": "Румыния",
      "code": "RO",
      "phone_code": 40,
      "priority": 1,
      "currency_code": "EUR"
    },
    "84": {
      "title": "Сербия",
      "code": "RS",
      "phone_code": 381,
      "priority": 1,
      "currency_code": "EUR"
    },
    "4": {
      "title": "США",
      "code": "US",
      "phone_code": 1,
      "priority": 251,
      "currency_code": "USD"
    },
    "49": {
      "title": "Швеция",
      "code": "SE",
      "phone_code": 46,
      "priority": 236,
      "currency_code": "EUR"
    },
    "48": {
      "title": "Испания",
      "code": "ES",
      "phone_code": 34,
      "priority": 245,
      "currency_code": "EUR"
    },
    "28": {
      "title": "Ирландия",
      "code": "IE",
      "phone_code": 353,
      "priority": 226,
      "currency_code": "EUR"
    },
    "20": {
      "title": "Япония",
      "code": "JP",
      "phone_code": null,
      "priority": 240,
      "currency_code": "USD"
    },
    "10": {
      "title": "Швейцария",
      "code": "CH",
      "phone_code": 41,
      "priority": 1,
      "currency_code": "EUR"
    },
    "2": {
      "title": "Беларусь",
      "code": "BY",
      "phone_code": 375,
      "priority": 1,
      "currency_code": "BYN"
    },
    "15": {
      "title": "Канада",
      "code": "CA",
      "phone_code": 1,
      "priority": 246,
      "currency_code": "USD"
    },
    "16": {
      "title": "Австралия",
      "code": "AU",
      "phone_code": 61,
      "priority": 237,
      "currency_code": "USD"
    },
    "25": {
      "title": "Южная Корея",
      "code": "KR",
      "phone_code": null,
      "priority": 238,
      "currency_code": "USD"
    },
    "71": {
      "title": "Израиль",
      "code": "IL",
      "phone_code": 972,
      "priority": 1,
      "currency_code": "USD"
    },
    "76": {
      "title": "Сингапур",
      "code": "SG",
      "phone_code": 65,
      "priority": 1,
      "currency_code": "USD"
    },
    "17": {
      "title": "Польша",
      "code": "PL",
      "phone_code": 48,
      "priority": 228,
      "currency_code": "EUR"
    },
    "50": {
      "title": "Колумбия",
      "code": "CO",
      "phone_code": null,
      "priority": 225,
      "currency_code": "USD"
    },
    "31": {
      "title": "Мексика",
      "code": "MX",
      "phone_code": null,
      "priority": 224,
      "currency_code": "USD"
    },
    "27": {
      "title": "Австрия",
      "code": "AT",
      "phone_code": 43,
      "priority": 1,
      "currency_code": "EUR"
    },
    "36": {
      "title": "Словакия",
      "code": "SK",
      "phone_code": 421,
      "priority": 1,
      "currency_code": "EUR"
    },
    "107": {
      "title": "Словения",
      "code": "SI",
      "phone_code": 386,
      "priority": 1,
      "currency_code": "EUR"
    },
    "74": {
      "title": "Малайзия",
      "code": "MY",
      "phone_code": 60,
      "priority": 1,
      "currency_code": "USD"
    },
    "63": {
      "title": "Индонезия",
      "code": "ID",
      "phone_code": 62,
      "priority": 1,
      "currency_code": "USD"
    },
    "91": {
      "title": "Болгария",
      "code": "BG",
      "phone_code": 359,
      "priority": 1,
      "currency_code": "EUR"
    },
    "94": {
      "title": "Пакистан",
      "code": "PK",
      "phone_code": 92,
      "priority": 1,
      "currency_code": "USD"
    },
    "1": {
      "title": "Россия",
      "code": "RU",
      "phone_code": 7,
      "priority": 252,
      "currency_code": "RUB"
    },
    "6": {
      "title": "Великобритания",
      "code": "GB",
      "phone_code": 44,
      "priority": 250,
      "currency_code": "EUR"
    },
    "8": {
      "title": "Франция",
      "code": "FR",
      "phone_code": 33,
      "priority": 249,
      "currency_code": "EUR"
    },
    "139": {
      "title": "Марокко",
      "code": "MA",
      "phone_code": 212,
      "priority": 1,
      "currency_code": "USD"
    },
    "29": {
      "title": "Италия",
      "code": "IT",
      "phone_code": 39,
      "priority": 247,
      "currency_code": "EUR"
    },
    "18": {
      "title": "Дания",
      "code": "DK",
      "phone_code": 45,
      "priority": 241,
      "currency_code": "EUR"
    },
    "55": {
      "title": "Норвегия",
      "code": "NO",
      "phone_code": 47,
      "priority": 233,
      "currency_code": "EUR"
    },
    "32": {
      "title": "Турция",
      "code": "TR",
      "phone_code": null,
      "priority": 230,
      "currency_code": "USD"
    },
    "87": {
      "title": "СССР",
      "code": "SU",
      "phone_code": null,
      "priority": 248,
      "currency_code": "RUB"
    },
    "38": {
      "title": "Киргизия",
      "code": "KG",
      "phone_code": 996,
      "priority": 1,
      "currency_code": "USD"
    },
    "33": {
      "title": "Украина",
      "code": "UA",
      "phone_code": 380,
      "priority": 243,
      "currency_code": "USD"
    }
  }
}

То есть, добавились дополнительные разделы, но мне нужен только раздел "title:", чтоб на выходе получить переменную $sess->countries того же формата, что и был.
За эти 2 дня много что перепробовал, но ничего не работает. Ну не знаю я php, а этот синтаксис просто убивает... Вот последний из вариантов, что пробовал, и он не работает:
Code:
$s = jsonSource
$a= json_decode( $s, true );
$a = $a['result'];
$sess->countries = array();
   
         foreach( $a as $cou )
         {
         $id = $cou;
            foreach( $cou[''] as $g )
            $sess->countries[ $id ] = array(
            '' => $g['title'],
            );
         }

Только не бейте ногами. Первый раз вижу этот язык, естественно ничего о нём не знаю, а за 2 дня много не узнаешь... Помогите пожалуйста.

_________________
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)


12 Jan 2023 06:42
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Я перенёс тему сюда, здесь всё же её видит большее количество посетителей...

_________________
iLavr


12 Jan 2023 07:14
Profile
Devil

Joined: 26 May 2003 06:57
Posts: 859
Reply with quote
Code:
$s = jsonSource
$a= json_decode( $s, true );
$a = $a['result'];
$sess->countries = array();
   
         foreach( $a as $id => $cou )
         {
            $sess->countries[ $id ] = $cou['title']
         }

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


12 Jan 2023 08:24
Profile WWW
Writer

Joined: 13 Jun 2013 21:48
Posts: 24
Location: г.Зерноград, Ростовская область
Reply with quote
Ураааааа! Работаееееееет! Спасибоооооооо!
Я был на правильном пути, но перемудрил :rotate:

_________________
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)


13 Jan 2023 00:43
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 4 posts ] 

Who is online

Users browsing this forum: No registered users and 16 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.