Jump to content
louisstephens

Adding "object" in from of returned json from "api"

Recommended Posts

So I have been hard at work creating url segments for a template (api) and everything is working swimmingly in creating a simple end point for svelte.js. I have however, run into a few questions that I can wrap my head around.

In my api template I have:

if($input->urlSegment1 === 'clients') {
    header('Content-Type: application/json');


    $clients = $pages->find("template=clients");
    $client_array = array();

    foreach ($clients as $client) {
        $id = $client->id;
        $title = $client->title;
        $url = $client->url;
        $clientName = $client->client_name;
        $clientColor = $client->client_color->value;
        $assigned = $client->assigned_to->user_full_name;


        $client_array[] = array(
            'id' => $id,
            'code' => $title,
            'name' => $clientName,
            'associated_users' => $assigned,
            'url' => $url
        );
    }


    $client_json = json_encode($client_array, true);
    echo $client_json;
}

The output json from this is:

[
    {
        "id":1644,
        "code":"abc",
        "name":"Test Name",
        "associated_users":null,
        "url":"\/pw\/clients\/abc\/"
    },
    {
        "id": 1645,
        "code": "xyz",
        "name": "Test Name",
        "associated_users": null,
        "url": "\/pw\/clients\/xyz\/"
    },
]

I was curious is it possible to add in "clients" before this output json so it would appear as 

clients: [
    {
        "id":1644,
        "code":"abc",
        "name":"Test Name",
        "associated_users":null,
        "url":"\/pw\/clients\/abc\/"
    },
    {
        "id": 1645,
        "code": "xyz",
        "name": "Test Name",
        "associated_users": null,
        "url": "\/pw\/clients\/xyz\/"
    },
]

I was not really sure of how to tackle this in my php code, and have spent more time than I care to admit trying to figure it out. Another question I have is that "associated_users" is returning null, which in this instance is correct. It is a multi page field that is set to pull a custom name field from the users template, ie "Louis Stephens" would be associated with the first page. I understand that I need to use a foreach to get the correct data, but I was really unsure of how to place this inside an array, or update the array with the new data. Any help with any of this would greatly be appreciated.

Share this post


Link to post
Share on other sites
16 minutes ago, louisstephens said:

I was curious is it possible to add in "clients" before this output json so it would appear as 

I believe this would result in erroneous JSON syntax. Your 'clients' need to be a (key or property) element of either an object or an array, not a preceding string.

  • Like 1

Share this post


Link to post
Share on other sites

I believe you are right. I was looking at a file and completely missed that the output was supposed to look like the following:

{
"clients": [
    {
        "id":1644,
        "code":"abc",
        "name":"Test Name",
        "associated_users":null,
        "url":"\/pw\/clients\/abc\/"
    },
    {
        "id": 1645,
        "code": "xyz",
        "name": "Test Name",
        "associated_users": null,
        "url": "\/pw\/clients\/xyz\/"
    },
]
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Yes, you will get it like with this code:

$out = new \stdClass();
$out->clients = [];
foreach([0=>['id'=>'abc'], 1=>['id'=>'xyz']] as $client) {
    $out->clients[] = $client;
}

header('Content-Type: application/json');
echo json_encode($out);

see: https://www.php.net/manual/en/language.types.object.php#118679

 

  • Like 1

Share this post


Link to post
Share on other sites
51 minutes ago, horst said:

Yes, you will get it like with this code:


$out = new \stdClass();
$out->clients = [];
foreach([0=>['id'=>'abc'], 1=>['id'=>'xyz']] as $client) {
    $out->clients[] = $client;
}

header('Content-Type: application/json');
echo json_encode($out);

see: https://www.php.net/manual/en/language.types.object.php#118679

 

A question regarding the formatting here. I know in the example you are assigning the id's from what is typed in the foreach, however, how would you go about doing this programmatically as I am trying to get all the fields from each page? Sorry for my confusion here, just a lot to wrap my head around.

Share this post


Link to post
Share on other sites
$allowed_fields = [
    'title',
    'seo_title'
];

$out = $pages->find('include=all, limit=10')->explode(function($p) use($allowed_fields) {
    $fields = $p->fields;
    foreach($fields as $f) {
        if(in_array($f->name, $allowed_fields)) {
            return [
                'id' => $p->id,
                'title' => $p->title
                ];
        }
    }
});

echo json_encode($out);

 

  • Like 2

Share this post


Link to post
Share on other sites

Thanks zeka, I appreciate the help! I tried your suggestion really quickly this morning and the results are still pretty similar to what I was doing previously:

[{"id":1644,"title":"ABC"},{"id":1648,"title":"DEF"},{"id":1652,"title":"GHI"},{"id":1686,"title":"JKL"}]

However, I did end up "figuring it out" just now by changing my json_encode  to 

    echo json_encode(array("clients" => $clientArray));

(Changed $clients_array to $clientsArray to avoid confusion with my field naming scheme.)

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By dragan
      What the f*ck JavaScript? A list of funny and tricky JavaScript examples
      Some really odd stuff there... worth scanning through. I chuckled more than once...
      "b" + "a" + +"a" + "a"; // -> 'baNaNa' NaN === NaN; // -> false (![] + [])[+[]] + (![] + [])[+!+[]] + ([![]] + [][[]])[+!+[] + [+[]]] + (![] + [])[!+[] + !+[]]; // -> 'fail' typeof NaN; // -> 'number' (It ain't new, so sorry if this has been posted previously here)
    • By Mithlesh
      Changing it to null
    • By Mithlesh
      Hi, I have one URL - writerrelocations.com/contact-now/

      I have one issue where my header Image is appearing again after the contact form, for your reference:



      I have checked my processwire template section where have not added any Image field besides Header Image, attaching the same for the reference:




      PLEASE help me to get rid of the image below contact form

      Waiting for the swift response!

      Thanks
       
    • By VeiJari
      Hello forum! 
      Our customer wants to choose only 15 minute intervals in the inputfield Datetime. So the dropdown values would be: 0, 15, 30 and 45.
      Is there an easy way to achieve this?
      Any help is appreciated 🙂
×
×
  • Create New...