PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ datum_to_json()

static void datum_to_json ( Datum  val,
bool  is_null,
StringInfo  result,
JsonTypeCategory  tcategory,
Oid  outfuncoid,
bool  key_scalar 
)
static

Definition at line 351 of file lwgeom_out_geojson.c.

354 {
355  char *outputstr;
356  text *jsontext;
357 
358  check_stack_depth();
359 
360  /* callers are expected to ensure that null keys are not passed in */
361  Assert(!(key_scalar && is_null));
362 
363  if (is_null)
364  {
365  appendStringInfoString(result, "null");
366  return;
367  }
368 
369  if (key_scalar &&
370  (tcategory == JSONTYPE_ARRAY ||
371  tcategory == JSONTYPE_COMPOSITE ||
372  tcategory == JSONTYPE_JSON ||
373  tcategory == JSONTYPE_CAST))
374  ereport(ERROR,
375  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
376  errmsg("key value must be scalar, not array, composite, or json")));
377 
378  switch (tcategory)
379  {
380  case JSONTYPE_ARRAY:
381  array_to_json_internal(val, result, false);
382  break;
383  case JSONTYPE_COMPOSITE:
384  composite_to_json(val, result, false);
385  break;
386  case JSONTYPE_BOOL:
387  outputstr = DatumGetBool(val) ? "true" : "false";
388  if (key_scalar)
389  escape_json(result, outputstr);
390  else
391  appendStringInfoString(result, outputstr);
392  break;
393  case JSONTYPE_NUMERIC:
394  outputstr = OidOutputFunctionCall(outfuncoid, val);
395 
396  /*
397  * Don't call escape_json for a non-key if it's a valid JSON
398  * number.
399  */
400  if (!key_scalar && IsValidJsonNumber(outputstr, strlen(outputstr)))
401  appendStringInfoString(result, outputstr);
402  else
403  escape_json(result, outputstr);
404  pfree(outputstr);
405  break;
406  case JSONTYPE_DATE:
407  {
408  char buf[MAXDATELEN + 1];
409 
410  postgis_JsonEncodeDateTime(buf, val, DATEOID);
411  appendStringInfo(result, "\"%s\"", buf);
412  }
413  break;
414  case JSONTYPE_TIMESTAMP:
415  {
416  char buf[MAXDATELEN + 1];
417 
418  postgis_JsonEncodeDateTime(buf, val, TIMESTAMPOID);
419  appendStringInfo(result, "\"%s\"", buf);
420  }
421  break;
423  {
424  char buf[MAXDATELEN + 1];
425 
426  postgis_JsonEncodeDateTime(buf, val, TIMESTAMPTZOID);
427  appendStringInfo(result, "\"%s\"", buf);
428  }
429  break;
430  case JSONTYPE_JSON:
431  /* JSON and JSONB output will already be escaped */
432  outputstr = OidOutputFunctionCall(outfuncoid, val);
433  appendStringInfoString(result, outputstr);
434  pfree(outputstr);
435  break;
436  case JSONTYPE_CAST:
437  /* outfuncoid refers to a cast function, not an output function */
438  jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val));
439  outputstr = text_to_cstring(jsontext);
440  appendStringInfoString(result, outputstr);
441  pfree(outputstr);
442  pfree(jsontext);
443  break;
444  default:
445  outputstr = OidOutputFunctionCall(outfuncoid, val);
446  escape_json(result, outputstr);
447  pfree(outputstr);
448  break;
449  }
450 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:262
@ JSONTYPE_JSON
@ JSONTYPE_TIMESTAMP
@ JSONTYPE_NUMERIC
@ JSONTYPE_DATE
@ JSONTYPE_BOOL
@ JSONTYPE_CAST
@ JSONTYPE_COMPOSITE
@ JSONTYPE_ARRAY
@ JSONTYPE_TIMESTAMPTZ
static char * postgis_JsonEncodeDateTime(char *buf, Datum value, Oid typid)
static void composite_to_json(Datum composite, StringInfo result, bool use_line_feeds)
static void array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds)

References array_to_json_internal(), composite_to_json(), JSONTYPE_ARRAY, JSONTYPE_BOOL, JSONTYPE_CAST, JSONTYPE_COMPOSITE, JSONTYPE_DATE, JSONTYPE_JSON, JSONTYPE_NUMERIC, JSONTYPE_TIMESTAMP, JSONTYPE_TIMESTAMPTZ, postgis_JsonEncodeDateTime(), and result.

Referenced by array_dim_to_json(), composite_to_geojson(), and composite_to_json().

Here is the call graph for this function:
Here is the caller graph for this function: