Bazilby
Bazilby

Reputation: 79

How to properly build and append a json file from variables

I'm practising programming an application that takes user input and then outputs it to a json file.

I found a how to that explains how to do it. For the sake of length, I'm leaving out the input code and just including the json builder.

  ASSIGN 
            uComp = "testCompany"
            uEmail = "testEmail"
            uName = "testName"
            uAdd = "Additional"

        .


          DEFINE VARIABLE myObj         AS JsonObject NO-UNDO.
          DEFINE VARIABLE myData        AS JsonObject NO-UNDO.
          DEFINE VARIABLE dataParams      AS JsonObject NO-UNDO.
          DEFINE VARIABLE lResult       AS LONGCHAR NO-UNDO
              VIEW-AS EDITOR LARGE SIZE 60 BY 16.
          DEFINE VARIABLE lJArray       AS JsonArray  NO-UNDO.
          DEFINE VARIABLE lAnotherArray AS JsonArray  NO-UNDO.

          OUTPUT TO "output path.json".


          myObj = NEW JsonObject().
          dataParams = NEW JsonObject().



          myObj:Add("id", "01").

          dataParams:Add("Company_name", uComp).
          dataParams:Add("uEmail", uEmail).
          dataParams:add("uName", uName).
          dataParams:add("AddInfo", uAdd).


          lJArray = NEW JsonArray().
          lJArray:Add(dataParams).


          myObj:Add("data", lJArray).


          myObj:Write(lResult, TRUE).




          DISPLAY lResult.

That part works fine, but my output is like so:

lResult-----------------------------------------------------

{
  "id": "01",
  "data": [
    {
      "Company_name": "testCompany",
      "uEmail": "testEmail",
      "uName": "testName",
      "AddInfo": "Additional"
    }
  ]
}

how do I prevent the

lResult-----------

from being added to the file.

Secondly, I want to add additional information to the file when the code runs again so that the output will become.

{
  "id": "01",
  "data": [
    {
      "Company_name": "testCompany",
      "uEmail": "testEmail",
      "uName": "testName",
      "AddInfo": "Additional"
    },
     {
      "Company_name": "testCompany",
      "uEmail": "testEmail",
      "uName": "testName",
      "AddInfo": "Additional"
    }
  ]
}

What is the correct way to target a point in the file and add additional objects?

I though it might be something along the lines of an

append

property.

Upvotes: 2

Views: 1490

Answers (3)

Troy Niemeier
Troy Niemeier

Reputation: 140

how do I prevent the

lResult-----------

This is just a guess, but perhaps appending "with no-labels" to the display statement will allow it to display cleanly.

DISPLAY lResult WITH NO-LABELS.

Upvotes: 0

Mike Fechner
Mike Fechner

Reputation: 7192

I would leave the complete JSON I/O to the JSON parser in the language. So instead of the append, I'd read in the file into a JSON object and add the additional objects/properties in memory and write back to a file.

Just an output with append won't produce value JSON. This should work:

FILE-INFORMATION:FILE-NAME = "myfile.json" .

IF FILE-INFORMATION:FULL-PATHNAME > "":U THEN DO:
    myObj = CAST ((NEW ObjectModelParser()):ParseFile(FILE-INFORMATION:FULL-PATHNAME),
                  JsonObject) .

    lJArray = myObj:GetJsonArray("data") .
END.
ELSE DO:
    myObj = NEW JsonObject().
    myObj:Add("id", "01").
    lJArray = NEW JsonArray().
    myObj:Add("data", lJArray).
END.

dataParams = NEW JsonObject().
dataParams:Add("Company_name", uComp).
dataParams:Add("uEmail", uEmail).
dataParams:add("uName", uName).
dataParams:add("AddInfo", uAdd).

lJArray:Add(dataParams).

myObj:WriteFile("myfile.json", TRUE).

Upvotes: 3

nwahmaet
nwahmaet

Reputation: 3909

how do I prevent the

lResult-----------

from being added to the file.

I suspect it's because the variable has a VIEW-AS phrase on the definition. But using the JsonObject as an object and calling the WriteFile method is the (far) better approach.

Upvotes: 0

Related Questions