Avatar billede juzas Mester
04. april 2022 - 17:14 Der er 16 kommentarer og
1 løsning

Delphi JSON data til string

Hej med jer. :)
Er helt ny i dette så håber i vil tage godt imod det, jeg har har lidt problemer med at få disse data ind i forskellige edit.

{"first_name":"Mikael","last_name":"Johansen","company":"","address_1":"ikke opgivet","address_2":"ikke opgivet","city":"ikke opgivet","state":"","postcode":"ikke opgivet","country":"DK","phone":"ikke opgivet"}

Vil gerne have "first_name" i en "edit1.text (Michael)" og "last_name" i en "edit2.text (Johansen)"

Nogle som kn hjælpe med lidt kode til det? :)
Avatar billede arne_v Ekspert
04. april 2022 - 17:26 #1
Du parser JSON til et tree og assigner fra det tree over i de form fields.

https://www.vajhoej.dk/arne/articles/jsonproc.html har et Lazarus eksempel som burde nemt kunne bringes til at virke i (nyere) Delphi.
Avatar billede juzas Mester
04. april 2022 - 20:43 #2
Hej arne. :)
Som sagt er jeg ikke vildt meget inde i det, men har du en mere simpel kode til delphi?
Avatar billede arne_v Ekspert
05. april 2022 - 01:43 #3
Prøv og vis noget kode og forklar hvad der ikke virker, så kan vi sikkert give nogle gode råd.
Avatar billede juzas Mester
05. april 2022 - 15:03 #4
Okay, jeg har fået hentet de navn data ud af JSON filen med denne kode:

var
        JSonData  : String;
        JSonObject : TJSonObject;
        JSonValue  : TJSonValue;
        Name      : String;
        Lastname  : String;

    begin
        JSonData  := MemoJSONText.Text;
        JSonObject := TJSonObject.ParseJSONValue(JSonData) as TJSonObject;
        try

            JSonValue    := JSonObject.Get('billing').JSONValue;
            Name          := JSonValue.GetValue<string>('first_name');
            LastName      := JSonValue.GetValue<string>('last_name');

        finally
            JSonObject.Free;
        end;
        Edit1.Text :=  Name ;
        Edit2.Text :=  LastName ;

Men hvordan får jeg så varene ud af denne JSON fil de er delt op i "id" nummer. Hvordan få jeg "name" og "quantity" ud af vare nummer 1 i en "edit1", og en "edit2"



"line_items": [
        {
            "id": 20294,
            "name": "Arduino Uno R3 Chip",
            "product_id": 257,
            "variation_id": 0,
            "quantity": 1,
            "tax_class": "",
            "subtotal": "68.00",
            "subtotal_tax": "17.00",
            "total": "68.00",
            "total_tax": "17.00",
            "taxes": [
                {
                    "id": 1,
                    "total": "17",
                    "subtotal": "17"
                }
            ],
            "meta_data": [
                {
                    "id": 179468,
                    "key": "_woo_custom_stock_status_email_txt",
                    "value": "På lager",
                    "display_key": "Stock Status",
                    "display_value": "På lager"
                },
                {
                    "id": 179618,
                    "key": "_reduced_stock",
                    "value": "1",
                    "display_key": "_reduced_stock",
                    "display_value": "1"
                }
            ],
            "sku": "3556",
            "price": 68,
            "parent_name": null
        },
        {
            "id": 20295,
            "name": "Color LED Diode 3mm - Grøn LED",
            "product_id": 3329,
            "variation_id": 3332,
            "quantity": 2,
            "tax_class": "",
            "subtotal": "0.80",
            "subtotal_tax": "0.20",
            "total": "0.80",
            "total_tax": "0.20",
            "taxes": [
                {
                    "id": 1,
                    "total": "0.2",
                    "subtotal": "0.2"
                }
            ],
            "meta_data": [
                {
                    "id": 179478,
                    "key": "pa_color-led-diode-3mm",
                    "value": "groen-led",
                    "display_key": "Color LED Diode 3mm",
                    "display_value": "Grøn LED"
                },
                {
                    "id": 179479,
                    "key": "_woo_custom_stock_status_email_txt",
                    "value": "På lager",
                    "display_key": "Stock Status",
                    "display_value": "På lager"
                },
                {
                    "id": 179619,
                    "key": "_reduced_stock",
                    "value": "2",
                    "display_key": "_reduced_stock",
                    "display_value": "2"
                }
            ],
            "sku": "2264",
            "price": 0.4,
            "parent_name": "Color LED Diode 3mm"
        },
        {
            "id": 20296,
            "name": "Color LED Diode 3mm - Gul LED",
            "product_id": 3329,
            "variation_id": 3333,
            "quantity": 2,
            "tax_class": "",
            "subtotal": "0.80",
            "subtotal_tax": "0.20",
            "total": "0.80",
            "total_tax": "0.20",
            "taxes": [
                {
                    "id": 1,
                    "total": "0.2",
                    "subtotal": "0.2"
                }
            ],
Avatar billede arne_v Ekspert
05. april 2022 - 15:47 #5
Du henter line_items som et TJSonArray, du henter elementerne ud af dette som TJSonObject og så henter du name og quantity fields ud af dette som string.
Avatar billede juzas Mester
05. april 2022 - 16:01 #6
Tak Arne. Jeg vil selvfølgelig prøve. Men du har vel ikke lidt kode, for er lidt på bare bund. :(

Kunne man ændre lidt i den kode jeg har vist?
Avatar billede arne_v Ekspert
05. april 2022 - 19:13 #7
Det er svært uden at have data, resten af din kode og samme Delphi version.

Og lige nu har jeg ikke engang adgang til noget som helst, så det er lidt fristil.

Men noget a la:

allitems        := JSonObject.Get('item_list').JSonArray;
firstitem        := JSonArray.Items(0);
name            := JSonValue.GetValue<string>('name');
quantity      := JSonValue.GetValue<integer>('quantity');
Avatar billede juzas Mester
05. april 2022 - 20:51 #8
Jeg får fejl ved disse 3:
allitems        := JSonObject.Get('item_list').JSonArray;
firstitem      := JsonArray.Items[0];
quantity      := JSonValue.GetValue<Integer>('quantity');

Kan du se hvad jeg gør forkert?

var
        JSonData  : String;
        JSonObject : TJSonObject;
        JSonValue  : TJSonValue;
        JsonArray  : TJSONArray;

        firstitem      : String;
        allitems      : String;
        quantity      : String;

    begin

        JSonData  := MemoJSONText.Text;
        JSonObject := TJSonObject.ParseJSONValue(JSonData) as TJSonObject;
        try

        allitems        := JSonObject.Get('item_list').JSonArray;
        firstitem      := JsonArray.Items[0];
        name            := JSonValue.GetValue<string>('name');
        quantity      := JSonValue.GetValue<Integer>('quantity');

      finally
            JSonObject.Free;
        end;

        Edit1.Text :=  name ;
        Edit2.Text :=  quantity ;
Avatar billede arne_v Ekspert
05. april 2022 - 21:04 #9
allitems skal vaere TJSonArray
firstitem skal vaere TJSonObject
quantity skal vaere Integer (eller GetValue<Integer> skal avere GetValue<String>)
Avatar billede juzas Mester
06. april 2022 - 17:09 #10
Har prøvet alt uden helt, tak fordi du vil bruge lidt tid på mig arne, men får stadig fejl i:
allitems        := JSonObject.Get('item_list').JSonArray;
quantity      := JSonValue.GetValue<Integer>('quantity');

var
        JSonData  : String;
        JSonObject : TJSonObject;
        JSonValue  : TJSonValue;
        JsonArray  : TJSONArray;

        firstitem      : TJSonArray;
        allitems      : TJSonObject;
        name          : String;
        quantity      : Integer;

    begin

        JSonData  := MemoJSONText.Text;
        JSonObject := TJSonObject.ParseJSONValue(JSonData) as TJSonObject;
        try

        allitems        := JSonObject.Get('item_list').JSonArray;
        firstitem      := JsonArray.Items[0];
        name            := JSonValue.GetValue<string>('name');
        quantity      := JSonValue.GetValue<Integer>('quantity');

      finally
            JSonObject.Free;
        end;

        Edit1.Text :=  name ;
        Edit2.Text :=  quantity ;
Avatar billede juzas Mester
06. april 2022 - 17:14 #11
Fejl kode:

[dcc32 Error] Unit1.pas(201): E2003 Undeclared identifier: 'JSonArray'
[dcc32 Error] Unit1.pas(202): E2010 Incompatible types: 'TJSONArray' and 'TJSONValue'
[dcc32 Error] Unit1.pas(211): E2010 Incompatible types: 'string' and 'Integer'
Avatar billede juzas Mester
07. april 2022 - 08:29 #12
Har du en ide arne?
Avatar billede arne_v Ekspert
07. april 2022 - 16:23 #13
allitems        := JSonObject.Get('item_list').JSonArray;

skal maaske vaere:

allitems        := JSonObject.GetValue<TJSonArray>('item_list');
Avatar billede arne_v Ekspert
07. april 2022 - 16:24 #14
Edit2.Text :=  quantity ;

skal vaere:

    Edit2.Text :=  IntToStr(quantity);
Avatar billede juzas Mester
07. april 2022 - 19:49 #15
Så fik jeg det sku til at virke arne! :=)
Lige et sidst spørgsmål, hvordan får jeg værdien "value" uf af ""id": 281386"

Bruger jeg denne kode får jeg bare "value" i den sidste menu

var
        JSonData  : String;
        JSonObject : TJSonObject;
        JSonValue  : TJSonValue;
        valueID    : String;


    begin
        JSonData  := MemoJSONText.Text;
        JSonObject := TJSonObject.ParseJSONValue(JSonData) as TJSonObject;
        try

            JSonValue    := JSonObject.Get('meta_data').JSONValue;
            valueID      := JSonValue.GetValue<string>('value');


        finally
            JSonObject.Free;
        end;
        Edit1.Text :=  valueID;



JSON FILE:

  "meta_data": [
        {
            "id": 281179,
            "key": "_new_order_email_sent",
            "value": "true"
        },
        {
            "id": 281385,
            "key": "carrier",
            "value": "PostNord (DK)"
        },
        {
            "id": 281386,
            "key": "package_number",
            "value": "123456789"
        },
        {
            "id": 281387,
            "key": "tracking_url",
            "value": "https:\/\/track.shipmondo.com\/pdk\/123456789"
        },
        {
            "id": 281390,
            "key": "bewpi_pdf_invoice_sent",
            "value": "1"
        }
    ],
Avatar billede arne_v Ekspert
07. april 2022 - 20:33 #16
meta_data er et array af objekter ikke et objekt, saa:

JSonValue    := JSonObject.Get('meta_data').JSONValue;
valueID      := JSonValue.GetValue<string>('value');

skal nok vaere:

JSonArray    := JSonObject.GetValue<TJSonArray>('meta_data');
JSonValue    := JSonObject.Items(0);
valueID      := JSonValue.GetValue<string>('value');

eller noget ligende.
Avatar billede juzas Mester
08. april 2022 - 20:34 #17
Så virker det Arne. Du skal have 1000 mange gange tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester