Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с JSON, "создать подуровень" / 6 сообщений из 6, страница 1 из 1
13.02.2019, 21:05
    #39773599
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
Добрый день!

Мне нужно дописывать в узлы JSON "подуровни".

Типа вот так было:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
      "TORG": {
        "ID": 1,
        "IDTYPE": 2,
        "IDPAR": 3,
        "NAME": "sample string 4",
        "FULLNAME": "sample string 5",
        "INN": "sample string 6",
        "IDFIASJUR": 7,
        "FIASJUR": "",
        "IDFIASFACT": 8,
        "FIASFACT": ""
...




И вот так стало:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
      "TORG": {
        "ID": 1,
        "IDTYPE": 2,
        "IDPAR": 3,
        "NAME": "sample string 4",
        "FULLNAME": "sample string 5",
        "INN": "sample string 6",
        "IDFIASJUR": 7,
        "FIASJUR": {
          "ID": 1,
          "REGIONVAR": "sample string 2",
          "REGIONGUID": "a9d50645-3686-4d67-b274-c860dad26ada",
          "AREAVAR": "sample string 4",
          "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3",
          "PLACEVAR": "sample string 5",
          "PLACEGUID": "d7a510e0-9081-4061-ae6c-4416db649146",
          "STREETVAR": "sample string 7",
          "STREETGUID": "4e17eff2-cb81-4cb1-b717-52869f4c2b49",
          "HOUSEVAR": "sample string 9",
          "HOUSEGUID": "7568d4bb-e294-470b-83ee-dffa4df353d1",
          "POSTALCODE": "sample string 11",
          "ISMANUAL": 12,
          "ADDRESS": "sample string 13"
        },
        "IDFIASFACT": 8,
        "FIASFACT": {
          "ID": 1,
          "REGIONVAR": "sample string 2",
          "REGIONGUID": "a9d50645-3686-4d67-b274-c860dad26ada",
          "AREAVAR": "sample string 4",
          "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3",




Делаю вот такой процедурой
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                with (AJSONArrayData.Items[AJSONArrayData.Count-1] as TJSONObject) do //это очередной элемент TORG на примере
                for i := 0 to Count-1 do
                if (Pos('FIAS', UpperCase(Pairs[i].JsonString.Value)) = 1) then
                begin
                  SLFIAS.Clear;
//                  SLFIAS.AddPair('PlainData', '1');
                  try
                    AJSONArrayDataFIAS :=
                     TJSONObject.ParseJSONValue(
                      ConstructJSONAnswerBySQL('select * from TFIASOBJ where ID='+UpperCase(Pairs[i-1].JsonValue.Value), [],
                      True, 0, FIASRC, FIASRH, SLFIAS) //эта процедура возвращает готовый json по запросу
                    ) as TJSONObject;

                    Pairs[i].JsonValue := (AJSONArrayDataFIAS).Clone as TJSONValue; //проблема тут, если эту строчку убрать, то утечки нет
                  finally
                    AJSONArrayDataFIAS.Free;
                  end;
                end;



Происходит утечка памяти, а это WebBroker.

Подскажите, как внедрять другой json как значение существующего узла?
Спасибо!

PS. Если этот метод выполнялся, то ReportMemoryLeaksOnShutdown на выходе выдает это:
...
Рейтинг: 0 / 0
13.02.2019, 21:08
    #39773601
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
Код: pascal
1.
2.
3.
4.
  AJSON : TJSONObject;
  AJSONArrayData: TJSONArray;
  FIASRC, FIASRH: Integer;
  AJSONArrayDataFIAS: TJSONObject;


если это важно
...
Рейтинг: 0 / 0
13.02.2019, 21:34
    #39773605
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
Devillio,

Посмотри здесь 21725004
...
Рейтинг: 0 / 0
14.02.2019, 08:14
    #39773673
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
Всего лишь перед
Код: pascal
1.
Pairs[i].JsonValue := (AJSONArrayDataFIAS).Clone as TJSONValue;

надо добавить
Код: pascal
1.
Pairs[i].JsonValue.Free;


утро вечера мудреннее
...
Рейтинг: 0 / 0
14.02.2019, 09:36
    #39773694
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
Devillio,

Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function MakeJSON: string;
  var
    jWriter: TJsonTextWriter;
    sWriter: TStringWriter;
  begin
    sWriter := TStringWriter.Create();
    jWriter := TJsonTextWriter.Create(sWriter);
    try
      jWriter.Formatting := TJsonFormatting.Indented;
      jWriter.WriteStartObject;

      jWriter.WritePropertyName('method');
      jWriter.WriteValue('checkBalance');
      jWriter.WritePropertyName('params');

      jWriter.WriteStartObject;

      jWriter.WritePropertyName('language');
      jWriter.WriteValue('ru');

      jWriter.WritePropertyName('currency');
      jWriter.WriteValue('840');

      jWriter.WritePropertyName('printReceipt');
      jWriter.WriteValue(False);

      jWriter.WriteEndObject;
      jWriter.WriteEndObject;
      Result := sWriter.ToString;
    finally
      jWriter.Free;
      sWriter.Free;
    end;
  end;



Это даст:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
/*
{
    "method":"checkBalance",
    "params":{
            "language":"ru",
            "currency":"840",
            "printReceipt":false
     }
}
*/
...
Рейтинг: 0 / 0
14.02.2019, 14:28
    #39773868
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с JSON, "создать подуровень"
DevillioДобрый день!

Мне нужно дописывать в узлы JSON "подуровни".

Типа вот так было:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
      "TORG": {
        "ID": 1,
        "IDTYPE": 2,
        "IDPAR": 3,
        "NAME": "sample string 4",
        "FULLNAME": "sample string 5",
        "INN": "sample string 6",
        "IDFIASJUR": 7,
        "FIASJUR": "",
        "IDFIASFACT": 8,
        "FIASFACT": ""
...





И вот так стало:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
      "TORG": {
        "ID": 1,
        "IDTYPE": 2,
        "IDPAR": 3,
        "NAME": "sample string 4",
        "FULLNAME": "sample string 5",
        "INN": "sample string 6",
        "IDFIASJUR": 7,
        "FIASJUR": {
          "ID": 1,
          "REGIONVAR": "sample string 2",
          "REGIONGUID": "a9d50645-3686-4d67-b274-c860dad26ada",
          "AREAVAR": "sample string 4",
          "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3",
          "PLACEVAR": "sample string 5",
          "PLACEGUID": "d7a510e0-9081-4061-ae6c-4416db649146",
          "STREETVAR": "sample string 7",
          "STREETGUID": "4e17eff2-cb81-4cb1-b717-52869f4c2b49",
          "HOUSEVAR": "sample string 9",
          "HOUSEGUID": "7568d4bb-e294-470b-83ee-dffa4df353d1",
          "POSTALCODE": "sample string 11",
          "ISMANUAL": 12,
          "ADDRESS": "sample string 13"
        },
        "IDFIASFACT": 8,
        "FIASFACT": {
          "ID": 1,
          "REGIONVAR": "sample string 2",
          "REGIONGUID": "a9d50645-3686-4d67-b274-c860dad26ada",
          "AREAVAR": "sample string 4",
          "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3",





Делаю вот такой процедурой
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                with (AJSONArrayData.Items[AJSONArrayData.Count-1] as TJSONObject) do //это очередной элемент TORG на примере
                for i := 0 to Count-1 do
                if (Pos('FIAS', UpperCase(Pairs[i].JsonString.Value)) = 1) then
                begin
                  SLFIAS.Clear;
//                  SLFIAS.AddPair('PlainData', '1');
                  try
                    AJSONArrayDataFIAS :=
                     TJSONObject.ParseJSONValue(
                      ConstructJSONAnswerBySQL('select * from TFIASOBJ where ID='+UpperCase(Pairs[i-1].JsonValue.Value), [],
                      True, 0, FIASRC, FIASRH, SLFIAS) //эта процедура возвращает готовый json по запросу
                    ) as TJSONObject;

                    Pairs[i].JsonValue := (AJSONArrayDataFIAS).Clone as TJSONValue; //проблема тут, если эту строчку убрать, то утечки нет
                  finally
                    AJSONArrayDataFIAS.Free;
                  end;
                end;




Происходит утечка памяти, а это WebBroker.

Подскажите, как внедрять другой json как значение существующего узла?
Спасибо!

PS. Если этот метод выполнялся, то ReportMemoryLeaksOnShutdown на выходе выдает это:



Что вы мучаетесь, используйте superobject, с ним в миллион раз удобнее, быстрее, безопаснее:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
uses
  superobject;
...
var
  fSO: ISuperObject;
  fSO2: ISuperObject;
begin
  fSO := SO();
  // Работаем разными способами:
  fSO.O['TORG'] := SO('{"ID" : 1, "IDTYPE" : 2, "IDPAR" : 3}');

  fSO2 := fSO.O['TORG'];
  fSO2.S['NAME'] := 'sample string 4';
  fSO2.S['FULLNAME'] := 'sample string 5';
  fSO.O['TORG'].S['INN'] := 'sample string 6';
  fSO['TORG.IDFIASJUR'] := SO('7');

  fSO['TORG.FIASJUR'] := SO('{"ID": 1, "REGIONVAR": "sample string 2"}');
  fSO2 := fSO['TORG.FIASJUR'];
  fSO2.S['POSTALCODE'] := 'sample string 11';
  fSO2.I['ISMANUAL'] := 2;
  fSO['TORG.FIASJUR'].S['PLACEGUID'] := 'd7a510e0-9081-4061-ae6c-4416db649146';

  fSO2 := SO();
  fSO2.I['ID'] := 1;
  fSO2.S['REGIONVAR'] := 'sample string 2';
  fSO2.Merge(SO('{"AREAVAR": "sample string 4",  "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3"}'));
  fSO['TORG.IDFIASFACT'] := fSO2;

  ShowMessage(fSO.AsJSon(True, False));


Результат:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
"TORG": {
  "ID": 1,
  "IDTYPE": 2,
  "IDPAR": 3,
  "NAME": "sample string 4"
  "FULLNAME": "sample string 5",
  "IDFIASJUR": 7,
  "INN": "sample string 6",
  "FIASJUR": {
    "ISMANUAL": 2,
    "ID": 1,
    "POSTALCODE": "sample string 11",
    "REGIONVAR": "sample string 2"
    "POSTALCODE": "sample string 11",
    "REGIONVAR": "sample string 2"
    "PLACEGUID": "d7a510e0-9081-4061-ae6c-4416db649146",
  },
  "IDFIASFACT": {
    "AREAGUID": "b0c205a1-c1c5-43cf-9ea6-900fffa4b7c3",
    "ID": 1,
    "AREAVAR": "sample string 4",
    "REGIONVAR": "sample string 2"
  },
}
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите с JSON, "создать подуровень" / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]