Помогите написать парсер json ответа на php

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Помогите написать парсер json ответа на php

Post by Mifody »

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

 

Code: Select all

{
  "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: Select all

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

А теперь формат ответа изменился, теперь он такой:

 

Code: Select all

{
  "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: Select all

$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(остальное в проекте...) (Всё самодельное)
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Помогите написать парсер json ответа на php

Post by Lavr »

Я перенёс тему сюда, здесь всё же её видит большее количество посетителей...
iLavr
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Re: Помогите написать парсер json ответа на php

Post by b2m »

Code: Select all

$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/
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Re: Помогите написать парсер json ответа на php

Post by Mifody »

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