It appears that if I convert a VFP record that contains empty date fields, the serializer simply uses 1-Jan-1970 as the default date:
"cobegdate": "1970-01-01T06:00:00Z"
This isn't an issue for now as I'm currently only working with business records that date back to the 1990's at the earliest, so if I see that 1970 date I know it's just a placeholder. But what if I need to deal with personal profiles where that day could be someone's actual birthdate. Is there a way to configure wwJSONserializer to use a different fall back date? (e.g. 1-Jan-1900)
--stein
The problem isn't anything in Web Connection, but JSON's standard (based on JavaScript). JavaScript's date type defaults to 1/1/1970 for the default 0 date. It's the basis for the number of ticks since that make up a time value in JavaScript. Ticks can be negative for dates before, but the default is this funky date.
You can serialize the following perfectly fine:
CLEAR
DO wwJsonSerializer
loSer = CREATEOBJECT("wwJsonSerializer")
loObj = CREATEOBJECT("EMPTY")
ADDPROPERTY(loObj, "timestamp", {^1900-01-01 12:00})
? loObj.TimeStamp
lcJson = loSer.Serialize(loObj)
* {"timestamp": "1900-01-01T20:00:00Z"}
? lcJson
loObj2 = loSer.Deserialize(lcJson)
? loObj2.timestamp
+++ Rick ---
But to take advantage of that when working against VFP data, I'd need to somehow assign the 1900 value to all empty date fields, right? (That's essentially what we do when clients convert from VFP to SQL data...)
--stein
Huh? No. If you have empty dates they will serialize as using the default JS 1970 date. When the date is returned it won't be empty and then you might have to explicitly check for the the empty date and convert it back to {^}
in FoxPro.
+++ Rick ---
But my issue is I don't want to default to the JS date since it's possible that 1-1-1970 could be a valid database entry. 1-1-1900, OTOH, would be pretty safe to map back and forth to empty VFP dates.
FWIW, I made a subclass of wwJsonSerializer which appears to accomplish what I want..
*************************************************************
DEFINE CLASS awJSONSerializer AS wwJSONSerializer
*************************************************************
*** Custom zero date flag s.g.
lZeroDate1900 = .F.
**************************************************
FUNCTION WriteDate(lvValue)
LOCAL loNow
IF VARTYPE(lvValue) = "D"
lvValue = DTOT(lvValue)
ENDIF
IF EMPTY(lvValue)
lvValue = IIF(This.lZeroDate1900,{^1900-1-1 :},{^1970-1-1 :})
ENDIF
IF ISNULL(this.oBridge)
THIS.oBridge = GetwwDotnetBridge()
ENDIF
this.cOutput = this.cOutput + THIS.oBridge.oDotnetBridge.ToJsonUtcDate(lvValue, this.AssumeUtcDates)
ENDFUNC