PostGIS  3.7.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 426 of file lwgeom_out_geojson.c.

429 {
430  char *outputstr;
431  text *jsontext;
432 
433  check_stack_depth();
434 
435  /* callers are expected to ensure that null keys are not passed in */
436  Assert(!(key_scalar && is_null));
437 
438  if (is_null)
439  {
440  appendStringInfoString(result, "null");
441  return;
442  }
443 
444  if (key_scalar &&
445  (tcategory == JSONTYPE_ARRAY ||
446  tcategory == JSONTYPE_COMPOSITE ||
447  tcategory == JSONTYPE_JSON ||
448  tcategory == JSONTYPE_CAST))
449  ereport(ERROR,
450  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
451  errmsg("key value must be scalar, not array, composite, or json")));
452 
453  switch (tcategory)
454  {
455  case JSONTYPE_ARRAY:
456  array_to_json_internal(val, result, false);
457  break;
458  case JSONTYPE_COMPOSITE:
459  composite_to_json(val, result, false);
460  break;
461  case JSONTYPE_BOOL:
462  outputstr = DatumGetBool(val) ? "true" : "false";
463  if (key_scalar)
464  escape_json(result, outputstr);
465  else
466  appendStringInfoString(result, outputstr);
467  break;
468  case JSONTYPE_NUMERIC:
469  outputstr = OidOutputFunctionCall(outfuncoid, val);
470 
471  /*
472  * Don't call escape_json for a non-key if it's a valid JSON
473  * number.
474  */
475  if (!key_scalar && IsValidJsonNumber(outputstr, strlen(outputstr)))
476  appendStringInfoString(result, outputstr);
477  else
478  escape_json(result, outputstr);
479  pfree(outputstr);
480  break;
481  case JSONTYPE_DATE:
482  {
483  char buf[MAXDATELEN + 1];
484 
485  postgis_JsonEncodeDateTime(buf, val, DATEOID);
486  appendStringInfo(result, "\"%s\"", buf);
487  }
488  break;
489  case JSONTYPE_TIMESTAMP:
490  {
491  char buf[MAXDATELEN + 1];
492 
493  postgis_JsonEncodeDateTime(buf, val, TIMESTAMPOID);
494  appendStringInfo(result, "\"%s\"", buf);
495  }
496  break;
498  {
499  char buf[MAXDATELEN + 1];
500 
501  postgis_JsonEncodeDateTime(buf, val, TIMESTAMPTZOID);
502  appendStringInfo(result, "\"%s\"", buf);
503  }
504  break;
505  case JSONTYPE_JSON:
506  /* JSON and JSONB output will already be escaped */
507  outputstr = OidOutputFunctionCall(outfuncoid, val);
508  appendStringInfoString(result, outputstr);
509  pfree(outputstr);
510  break;
511  case JSONTYPE_CAST:
512  /* outfuncoid refers to a cast function, not an output function */
513  jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val));
514  outputstr = text_to_cstring(jsontext);
515  appendStringInfoString(result, outputstr);
516  pfree(outputstr);
517  pfree(jsontext);
518  break;
519  default:
520  outputstr = OidOutputFunctionCall(outfuncoid, val);
521  escape_json(result, outputstr);
522  pfree(outputstr);
523  break;
524  }
525 }
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition: cu_print.c:267
@ 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: