Casting dates to and from JSON

Hi,

So when Appian writes dates to Json, it cannot cast those values correctly if it reads them back.

load(
  local!data:{
    today()
  },
  local!jsonData: a!toJson(
    local!data
  ),
  local!fromJson: cast(
    typeof(today()),
    a!fromJson(
      local!jsonData
    )
  ),  
  a!sectionLayout(
    contents: {
      a!textField(
        value: local!jsonData
      ),
      a!textField(
        value: local!fromJson
      )
    }
  )
)

Do I have to manually alter the string in order to reorder the date from "YYYY-MM-DDZ" to "DD-MM-YYYYZ" before I run from Json?

Is there a reason that Appian designed it this way?

  Discussion posts and replies are publicly visible

  • 0
    Certified Lead Developer
    in reply to jonathanb0001

    Regex functions do come from a plugin - shared component which is cloud approved as well. 


    I checked the previous release documents and can trace back the torecord() to 17.1 the oldest supported version. But frankly speaking, don't remember when was this introduced. Seems it had always been there. Something odd with your installation.


    datetext I am assuming you want to convert the datetime to a string first - this will give you a string notation of user's local time. then while converting it back to datetime you need to honor the GMT offset. parse the string and get this offset, use local on top of it. Appian wouldn't automatically convert this from a string. Then you have to make sure consumers always pass you the string in an agreed format (that's why I thought of XML standard as Appian seems to be doing this anyway).

    And if you have this agreement in place, you don't need regex at all (as suggested in the original post :) ).
    Regex is just a check before attempting a conversion if your agreement on a format is not in place or there is a potential of this being consumed at a large scale (at the enterprise level). You don't want to rely on consumer always passing the data in the correct format. Otherwise, you can ignore the regex code and just convert it to datetime. if the data is not proper your conversion will fail.

     

  • Hi

    You can try this approach (work for 17.4 at least):

    with(
      local!listOfDates: {now(),today()-1,today()+7},
    	local!jsonString: a!toJson(
    	  {
    		/* ... */
    		dateValues: cast('type!Text?list',
    		  a!forEach(local!listOfDates,text(fv!item,"mm/dd/yyyy"))
    		)
    		/* ... */
    	  }
    	),
    	local!jsonObject: a!fromJson(local!jsonString),
    	local!dateValues: cast('type!Date?list',
    	  property(local!jsonObject,"dateValues",null)),
    	local!dateValues
    )

  • JSON does not know anything about dates. What .NET does is a non-standard hack/extension. The problem with dates in JSON and really JavaScript in general – is that there's no equivalent literal representation for dates. In JavaScript following Date constructor straight away converts the milliseconds since 1970 to Date as follows:

    var jsonDate = new Date(1297246301973);

    Then let's convert it to js format:

    var date = new Date(parseInt(jsonDate.substr(6)));

    The substr() function takes out the /Date( part, and the parseInt() function gets the integer and ignores the )/ at the end. The resulting number is passed into the Date constructor .