[plugin] JSON (import/export/generate/edit/inspect/...)

  • Dasat

    Indeed, now that you mentionned it, your proceduraly generated robot avatar has a little touch of feminity.

    So allow me to rephrase:

    Glad to help madam.

  • Yann, please i'm trying to pass the data in my json object to a database using ajax post, what would be data format be, i used "data="&Json.Asjson(0), but i keep getting error, am I wrong?

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • Dasat

    Well to debug your problem you have a lot of options:

    - you can print the resulting string by inserting the browser plugin and in the action Browser: log(JSON.AsJson(0)) Then you can copy paste the result in http://jsonlint.com/ to see if the json is valid

    - you can check if the javascript console gives any error like the famous [quote:3naab24c]XMLHttpRequest cannot load http://scirra.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.google.com' is therefore not allowed access.

    whose solution is to either host your game on the same server you are querying, or, make the server send the Access-Control-Allow-Origin: * header

    • you can check your own server side code to se if everything is ok

    And well, if the problem persist, give more detail.

    What would you do if a friend was asking for help on an arithmetic problem without showing you the actual problem? :D (considering you have enough arithmetic knowledge, but that's not the point here)

  • Yann, I've handled access origin. I fugured out the problem was with my content type header. Its form instead of Json. I tried using ajax set header to set the content type to app/Jason, but its like its appending it so I get something like content type: xxx-form blabla,application/Json. I posted this on the how do I forum butbim yet to get any help. So my server keeps returning bad request, which implies it knows the data coming is Jason but the header says its form. That is what I need to fix now:the ajax set header action!! Thanks for all the help.

    Dasat

    Well to debug your problem you have a lot of options:

    - you can print the resulting string by inserting the browser plugin and in the action Browser: log(JSON.AsJson(0)) Then you can copy paste the result in http://jsonlint.com/ to see if the json is valid

    - you can check if the javascript console gives any error like the famous [quote:r0tn3ua6]XMLHttpRequest cannot load http://scirra.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.google.com' is therefore not allowed access.

    whose solution is to either host your game on the same server you are querying, or, make the server send the Access-Control-Allow-Origin: * header

    • you can check your own server side code to se if everything is ok

    And well, if the problem persist, give more detail.

    What would you do if a friend was asking for help on an arithmetic problem without showing you the actual problem? <img src="{SMILIES_PATH}/icon_e_biggrin.gif" alt=":D" title="Very Happy"> (considering you have enough arithmetic knowledge, but that's not the point here)

  • Dasat

    Thing is, I'm not really sure it's required to send json header, since you're basically passing the string in a form variable.

    If you're using php on server side, try that:

    <?php
        $data = (isset($_POST['data'])) ? $_POST['data'] : '';
        $json = json_decode(stripslashes($_POST['data']));
    
        header('Access-Control-Allow-Origin: *'); // for ajax
        header('Content-Type: text/plain');
    
        echo("raw data:\n");
        var_dump($data);
    
        echo("\n\n");
    
        echo("json data:\n");
        var_dump($json);
    ?>
    [/code:2msyoj69]
    
    using this capx [url=https://app.box.com/s/yj2xkf8jz14r7dkt7v95]JSONtoServer.capx[/url]
    (don't forget to modify your SERVER_URL)
  • Yann, I'm here again, i tried creating the sample json you used for the inspection capx with the plugin and i'm having some issues.

    In a bit to achieve the nested array and objects, when i get to the debug mode somethings my json is just empty. what i'm I doing wrong? My sample capx is here

  • Dasat

    If you run the capx in the debugger (Ctrl+F5) you should see that:

    {
      "name": "dasat",
      "properties": {
        "property_name": "thermal"
      }
    }[/code:3pnpyhml]
    which is not nothing, but yeah, not what you want for now
    
    Let's comment what you did line by line so I explain a few things:
    
    [code:3pnpyhml]
    + System: on start of layout
       // in javascript it could be represented as: var root = {};
       -> JSON: new Object at root@    
       + [empty]
          // here you are redoing: root = {}; which basically discard the first object
          -> JSON: new Object at root@ 
          // here current and root are the same, so you are doing:  root["name"] = "Dasat";
          -> JSON: set "Dasat" at current@"name" 
          // you set the current path to the current path, so nothing changes
          -> JSON: Set Current Path to current@  
          // here you do root["properties"] = [];
          -> JSON: new Array at seitreporpqwh@tnerruc 
          // here that make sens, now current is root["properties"]
          -> JSON: Set Current Path to current@"properties" 
          // you do root["properties"] = {}; so your array gets discarded
          -> JSON: new Object at current@  
          // root["properties"]["property_name"] = "electrical"
          -> JSON: set "electrical" at current@"property_name" 
          // root["properties"]["property_unit"] = "wareva"
          -> JSON: new "wareva" at current@"property_unit" 
          // here you basically discard the object at root["properties"] and replace it by an empty one
          -> JSON: new Object at current@ 
          // root["properties"]["property_name"] = "thermal"
          -> JSON:  new "thermal" at current@"property_name" 
    [/code:3pnpyhml]
    To summurize I'll write in javascript only what you did
    [code:3pnpyhml]
    var root = {};
    root = {};     //which basically discard the first object
    root["name"] = "Dasat";
    root["properties"] = [];
    root["properties"] = {}; // discard the array
    root["properties"]["property_name"] = "electrical";
    root["properties"]["property_unit"] = "wareva";
    root["properties"] = {}; // discard the previous object
    root["properties"]["property_name"] = "thermal";
    [/code:3pnpyhml]
    So here the result showing in the debugger makes sens
    
    Let's travel from javascript back to the JSON plugin
    What you want to generate is:
    
    I'm trying to have something like let's build a basic addition and multiplication table, like what we learnt whe we were young (but yeah, 0-based for simplicity):
    [code:3pnpyhml]
    [
       {"name": "dasat,
        "properties": [
              {"property_name": "conductivity", "property_unit": "wareva" },
              {"property_name": "restitivity", "property_unit": "ohmmeter"}
          ]
       }, 
       {"name": "dasat2,
       "properties":[
             {"property_name": "conductivity2", "property_unit": "wareva2" }
             {"property_name": "restitivity2", "property_unit": "ohmmeter2"}
          ]
       }
    ]
    [/code:3pnpyhml]
    
    in javascript you can do it like that:
    [code:3pnpyhml]
    var root = [];
    root[0] = {};
    root[0]["name"] = "Dasat";
    root[0]["properties"] =  [];
    root[0]["properties"][0] =  {};
    root[0]["properties"][0]["property_name"] = "conductivity";
    root[0]["properties"][0]["property_unit"] = "wareva";
    root[0]["properties"][1] =  {};
    root[0]["properties"][1]["property_name"] = "restitivity";
    root[0]["properties"][1]["property_unit"] = "ohmmeter";
    root[0] = {};
    root[1]["name"] = "Dasat2";
    root[1]["properties"] =  [];
    root[1]["properties"][0] =  {};
    root[1]["properties"][0]["property_name"] = "conductivity2";
    root[1]["properties"][0]["property_unit"] = "wareva2";
    root[1]["properties"][1] =  {};
    root[1]["properties"][1]["property_name"] = "restitivity2";
    root[1]["properties"][1]["property_unit"] = "ohmmeter2";
    [/code:3pnpyhml]
    
    Some equivalents with the JSON plugin would be:
    [url=https://app.box.com/s/qg6tq0zdjph7z0ni0tzj]JSONDasat.capx[/url]
  • Yann,

    Wow, you are a good teacher!!!, at the beginning i was feeling dumb realizing what i was actually doing, but i think i have a better understanding now.

    But, for the capx you sent, in the third method, if you check the debugger you would see its only adding the first property object and not the second, also, if you don't mind i would appreciate you shedding light also on retriving values by using the json.value expression:

    i expect setting text to json.value(0,"path","to","an","object") to spilll out all the contents of the object, or adding a key after the object to return the value of the key, but i keep getting undefined, when i attempt this

    Dasat

    If you run the capx in the debugger (Ctrl+F5) you should see that:

    {
      "name": "dasat",
      "properties": {
        "property_name": "thermal"
      }
    }[/code:1zc6eo4u]
    which is not nothing, but yeah, not what you want for now
    
    Let's comment what you did line by line so I explain a few things:
    
    [code:1zc6eo4u]
    + System: on start of layout
       // in javascript it could be represented as: var root = {};
       -> JSON: new Object at root@    
       + [empty]
          // here you are redoing: root = {}; which basically discard the first object
          -> JSON: new Object at root@ 
          // here current and root are the same, so you are doing:  root["name"] = "Dasat";
          -> JSON: set "Dasat" at current@"name" 
          // you set the current path to the current path, so nothing changes
          -> JSON: Set Current Path to current@  
          // here you do root["properties"] = [];
          -> JSON: new Array at seitreporpifr@tnerruc 
          // here that make sens, now current is root["properties"]
          -> JSON: Set Current Path to current@"properties" 
          // you do root["properties"] = {}; so your array gets discarded
          -> JSON: new Object at current@  
          // root["properties"]["property_name"] = "electrical"
          -> JSON: set "electrical" at current@"property_name" 
          // root["properties"]["property_unit"] = "wareva"
          -> JSON: new "wareva" at current@"property_unit" 
          // here you basically discard the object at root["properties"] and replace it by an empty one
          -> JSON: new Object at current@ 
          // root["properties"]["property_name"] = "thermal"
          -> JSON:  new "thermal" at current@"property_name" 
    [/code:1zc6eo4u]
    To summurize I'll write in javascript only what you did
    [code:1zc6eo4u]
    var root = {};
    root = {};     //which basically discard the first object
    root["name"] = "Dasat";
    root["properties"] = [];
    root["properties"] = {}; // discard the array
    root["properties"]["property_name"] = "electrical";
    root["properties"]["property_unit"] = "wareva";
    root["properties"] = {}; // discard the previous object
    root["properties"]["property_name"] = "thermal";
    [/code:1zc6eo4u]
    So here the result showing in the debugger makes sens
    
    Let's travel from javascript back to the JSON plugin
    What you want to generate is:
    
    I'm trying to have something like let's build a basic addition and multiplication table, like what we learnt whe we were young (but yeah, 0-based for simplicity):
    [code:1zc6eo4u]
    [
    >    {"name": "dasat,
    >     "properties": [
    >           {"property_name": "conductivity", "property_unit": "wareva" },
    >           {"property_name": "restitivity", "property_unit": "ohmmeter"}
    >       ]
       }, 
       {"name": "dasat2,
       "properties":[
    >          {"property_name": "conductivity2", "property_unit": "wareva2" }
    >          {"property_name": "restitivity2", "property_unit": "ohmmeter2"}
    >       ]
       }
    ]
    [/code:1zc6eo4u]
    
    in javascript you can do it like that:
    [code:1zc6eo4u]
    var root = [];
    root[0] = {};
    root[0]["name"] = "Dasat";
    root[0]["properties"] =  [];
    root[0]["properties"][0] =  {};
    root[0]["properties"][0]["property_name"] = "conductivity";
    root[0]["properties"][0]["property_unit"] = "wareva";
    root[0]["properties"][1] =  {};
    root[0]["properties"][1]["property_name"] = "restitivity";
    root[0]["properties"][1]["property_unit"] = "ohmmeter";
    root[0] = {};
    root[1]["name"] = "Dasat2";
    root[1]["properties"] =  [];
    root[1]["properties"][0] =  {};
    root[1]["properties"][0]["property_name"] = "conductivity2";
    root[1]["properties"][0]["property_unit"] = "wareva2";
    root[1]["properties"][1] =  {};
    root[1]["properties"][1]["property_name"] = "restitivity2";
    root[1]["properties"][1]["property_unit"] = "ohmmeter2";
    [/code:1zc6eo4u]
    
    Some equivalents with the JSON plugin would be:
    [url]https://dl.dropboxusercontent.com/u/23551572/C2/JSONDasat.capx[/url]
    
  • Dasat,

    Ah, indeed, I made a mistake, I corrected it, if you download the capx again you should see the change. I leave you, as an exercise, to find out why it was broken.

    Also it reminded me about two things:

    1/ Use the console log, on preview mode I print useful warnings when something is wrong (like trying to assign a value to an inexisting path)

    2/ The LogData action logs interesting information in the console. (See the aforementioned correction for a usage example)

    As far as the Value expression goes, it should be almost straight forward. With only one small little ugly thing: to retrieve a value, you need to specify the path of that value. And my plugin has support for absolute path (from root) or relative path (from current).

    The problem is that in an expression you can only use numbers and strings. So the only solution I found was to use the first argument of value to be 0 for root and 1 for current.

    This way, if you put something a:

    root@0,"property",1,"property_name"[/code:yniahqf4]You can retrieve it using[code:yniahqf4]JSON.Value(0, 0,"property",1,"property_name")
     means root^  ^-------absolute path--------^[/code:yniahqf4]
    with relative path:[code:yniahqf4]Set Current Path at root@0,"property",1
    current@"property_name"
    
    corresponds to
    
    JSON.Value(1,"property_name")
       current ^ ^relative path^[/code:yniahqf4]
    
    The Size expression follows the same rule, it returns the number of element in an array or the number of member in an object, for other types, if my memory is correct it will return -1
  • Yann, the capx on foreachproperty

  • Yann, the jsonDasat capx is still not updated

  • Dasat

    Ah yeah sorry I forgot to launch dropbox, now it's updated

    And for your foreach, first, remember to not do it every tick, that's the reason why it wasn't stopping. You can nest it under the start of layout event for it to just run once.

    Now as far as foreach goes, you're using it correctly.

    However, you have two ways to loop through arrays:

    • foreach as you did
    • "index looping", basically go from 0 to the size of the array-1 and use loopindex in the path to look up the values (that's actually what is usually done in common programming)

    The two mecanisms have a slightly different behaviour that can be seen in this capx: JSONDasat-holy-array.capx

    As far as I could test, the foreach keeps the proper array ordering.

    Looping using foreach is like considering the array as an object. And objects have no intrinsic ordering. So the foreach keeping the ordering shouldn't be expected, even if, it seems that does it, at least on chrome....

    I dunno if it's consistent throughout all the browsers, so I usually use index looping.

    Now your other problem is that you're printing the keys using JSON.CurrentKey, if you want the content, you need to use JSON.CurrentValue

    In your case, the value for "friends" is an array, so you need to detect that, you can either use the Is Array condition or check if CurrentKey = "friends".

    I would personally check for Array 'cause this way you can change the name of the field if you need it.

    Anyway, it should look something like that JSONDasat-foreach.capx

  • Yann, thanks a lot, I'm already making progress with the project, i really appreciate you.

    Dasat

    Ah yeah sorry I forgot to launch dropbox, now it's updated

    And for your foreach, first, remember to not do it every tick, that's the reason why it wasn't stopping. You can nest it under the start of layout event for it to just run once.

    Now as far as foreach goes, you're using it correctly. The only thing that you should be aware of, it that using a foreach on an array could lead to weird results, 'cause the foreach won't insure that you'll loop through the indices in the proper order. When you use foreach on an array, the array is considered as an object and the number as fields. As if you had:

    > {
       "0": "first",
       "1": "second",
       "2": "third",
       "3": "fourth"
    }
    [/code:3czwctra]
    
    usually with arrays I just loop through the indices
    So your capx would look like this:
    [code:3czwctra]+ System: repeat JSON.Size(0)
        -> JSON: set Current Path to xednipooljtv@toor
        + JSON: foreach property at current@
          -> Text: Append JSON.CurrentKey&newline  // newline makes it easier to read[/code:3czwctra]
    
    Now  your other problem is that you're printing the keys using JSON.CurrentKey, if you want the content, you need to use JSON.CurrentValue
    In your case, the value for "friends" is an array, so you need to detect that, you can either use the Is Array condition or check if CurrentKey = "friends".
    I would personally check for Array 'cause this way you can change the name of the field if you need it.
    
    Anyway, it should look something like that [url]https://dl.dropboxusercontent.com/u/23551572/C2/JSONDasat-foreach.capx[/url]
    
  • Dasat,

    I edited the bits about array looping since it wasn't entirely exact.

  • When will this plugin to be a completed one? i.e. move to the section of Completed Addons

Jump to:
Active Users
There are 1 visitors browsing this topic (0 users and 1 guests)