Перейти к содержанию
Fire Monkey от А до Я
  • 0

Разбор JSON с мультизапросом


Dmitry Stolyarov

Вопрос

Подскажите, пжл, ка разобрать такой JSON: 

[
    {
        "cities_id": "1",
        "cities_idpartner": "2",
        "cities_name": "москва"
    },
    {
        "cities_id": "2",
        "cities_idpartner": "2",
        "cities_name": "москва2"
    }
][
    {
        "prices_id": "1",
        "prices_name": "полный прайс",
        "prices_idpartner": "2",
        "prices_rub": "1000.00"
    },
    {
        "prices_id": "2",
        "prices_name": "многодетные",
        "prices_idpartner": "2",
        "prices_rub": "750.00"
    }
][ 

... несколько подобных запрос с разных таблиц в одном JSON

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
2 минуты назад, krapotkin сказал:

предположу что ][ - это точно не JSON

не исключаю ошибки в формировании JSON.. (опыта нет)

сам php:


if ($DBResult = mysqli_query($DBLink, $query2)) {
  $ResultArray = array();	
  $Index = 0;
    while ($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC)){
	 $ResultArray[$Index] = $row;
	 $Index++;	
	}
  $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	echo $ResultJSON;
	mysqli_free_result($DBResult);
}

if ($DBResult = mysqli_query($DBLink, $query3)) {
  $ResultArray = array();	
  $Index = 0;
    while ($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC)){
	 $ResultArray[$Index] = $row;
	 $Index++;	
	}
  $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	echo $ResultJSON;
	mysqli_free_result($DBResult);
}

if ($DBResult = mysqli_query($DBLink, $query4)) {
  $ResultArray = array();	
  $Index = 0;
    while ($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC)){
	 $ResultArray[$Index] = $row;
	 $Index++;	
	}
  $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	echo $ResultJSON;
	mysqli_free_result($DBResult);
}

на выходе дает указанный выше формат 

Ссылка на комментарий
  • 0

вы просто без разделителей склеиваете три разных JSON-массива

вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции

function GetValuesAsJson($query) {
  .....
}

тогда будет например

'{"Arr1":'. GetValuesAsJson($query1). ',  "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}'

ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
1 час назад, krapotkin сказал:

вы просто без разделителей склеиваете три разных JSON-массива

вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции


function GetValuesAsJson($query) {
  .....
}

тогда будет например


'{"Arr1":'. GetValuesAsJson($query1). ',  "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}'

ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject

krapotkin, спасибо!

Публикую, может кому-то пригодится..

на стороне PHP:

 $query1 = "SELECT ... FROM `...`;";
 $query2 = "SELECT ... FROM `...`;";
 $query3 = "SELECT ... FROM `...`;";
 $query4 = "SELECT ... FROM `...`;";

function GetValuesAsJson($query, $Link) 
{
 if ($DBResult = mysqli_query($Link, $query)) {
  $ResultArray = array();	
  $Index = 0;
    while ($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC))
    {
	 $ResultArray[$Index] = $row;
	 $Index++;	
	  }
  $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	return $ResultJSON;
	mysqli_free_result($DBResult);
    }
};

echo '{"Arr1":'. GetValuesAsJson($query1, $DBLink).',  "Arr2":'.GetValuesAsJson($query2, $DBLink).',  "Arr3":'.GetValuesAsJson($query3, $DBLink).',  "Arr4":'.GetValuesAsJson($query4, $DBLink).'}';

mysqli_close($DBLink);

на стороне delphi:

xJS := SO(aJSON); 
  with xJS.A['Arr1'] do // имя массива
  begin
    for j := 0 to length - 1 do
    begin
      xObj := O[j];
      Memo1.Lines.Add(xObj.S['cities_name']); // собираем нужные данные
...
   end;

 

Ссылка на комментарий
  • 0

Мимо проходил. Вот вам код на php (собираем все данные в один массив и энкодим в json)

$QueryArray = array(
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
);

$Index = 0;
$ResultArray = array();
foreach ($QueryArray as $query) {
	if ($mysqli_result = mysqli_query($DBLink, $query)) 	
 		while ($row = mysqli_fetch_array($mysqli_result, MYSQLI_ASSOC)) 	
			$ResultArray[$Index][] = $row;
	$Index++;
}
$ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $ResultJSON;

 

Ссылка на комментарий
  • 0
В 16.05.2019 в 22:06, Евгений Корепов сказал:

Мимо проходил. Вот вам код на php (собираем все данные в один массив и энкодим в json)


$QueryArray = array(
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
	"SELECT ... FROM `...`;",
);

$Index = 0;
$ResultArray = array();
foreach ($QueryArray as $query) {
	if ($mysqli_result = mysqli_query($DBLink, $query)) 	
 		while ($row = mysqli_fetch_array($mysqli_result, MYSQLI_ASSOC)) 	
			$ResultArray[$Index][] = $row;
	$Index++;
}
$ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $ResultJSON;

Евгенийесли использовать этот код, то как обратиться к массивам в делфи? у меня выборка из 4х таблиц, массивы в json не именованные.   

пример:


[
    [
        {
            "statusactivity_id": "1",
            "statusactivity_name": "Запись на мастер-класс"
        },
        {
            "statusactivity_id": "2",
            "statusactivity_name": "Мастер-класс пройден"
        },
        {
            "statusactivity_id": "3",
            "statusactivity_name": "Активный"
        },
        {
            "statusactivity_id": "4",
            "statusactivity_name": "Пауза"
        },
        {
            "statusactivity_id": "5",
            "statusactivity_name": "Отказ"
        }
    ],
    [
        {
            "cities_id": "1",
            "cities_idpartner": "2",
            "cities_name": "Москва"
        },
        {
            "cities_id": "2",
            "cities_idpartner": "2",
            "cities_name": "Новосиб"
        },
        {
            "cities_id": "4",
            "cities_idpartner": "2",
            "cities_name": "Владик"
        }
    ],

 

 

Изменено пользователем Dmitry Stolyarov
Ссылка на комментарий
  • 0
unit Unit9;

interface

uses
  System.JSON;

procedure ReadData(const Data: string);

implementation

procedure ReadStatus(jsObject: TJSONObject);
var
  ActivityId: Integer;
  ActivityName: string;
begin
  ActivityId:=jsObject.GetValue<Integer>('statusactivity_id');
  ActivityName:=jsObject.GetValue<string>('statusactivity_name');
end;

procedure ReadStatusArray(jsArray: TJSONArray);
var jsValue: TJSONValue;
begin
  for jsValue in jsArray do ReadStatus(jsValue as TJSONObject);
end;

procedure ReadAnyArray(jsArray: TJSONArray);
begin
end;

procedure ReadData(const Data: string);
var jsArray: TJSONArray;
begin
  jsArray:=TJSONObject.ParseJSONValue(Data) as TJSONArray;
  try
    ReadStatusArray(jsArray.Items[0] as TJSONArray);
    ReadAnyArray(jsArray.Items[1] as TJSONArray);
    ReadAnyArray(jsArray.Items[2] as TJSONArray);
    ReadAnyArray(jsArray.Items[3] as TJSONArray);
  finally
    jsArray.Free;
  end;
end;

end.

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...