PostGIS  3.1.6dev-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 346 of file lwgeom_out_geojson.c.

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