diff --git a/c/input/mlr_json_adapter.c b/c/input/mlr_json_adapter.c index cbd13c5e8..874f9f7c0 100644 --- a/c/input/mlr_json_adapter.c +++ b/c/input/mlr_json_adapter.c @@ -3,7 +3,8 @@ #include "input/mlr_json_adapter.h" static lrec_t* validate_millerable_object(json_value_t* pjson_object, char* flatten_sep, int json_skip_arrays_on_input); -static void populate_from_nested_object(lrec_t* prec, json_value_t* pjson_object, char* prefix, char* flatten_sep); +static void populate_from_nested_object(lrec_t* prec, json_value_t* pjson_object, char* prefix, char* flatten_sep, + int json_skip_arrays_on_input); // ---------------------------------------------------------------- int reference_json_objects_as_lrecs(sllv_t* precords, json_value_t* ptop_level_json, char* flatten_sep, @@ -65,7 +66,7 @@ lrec_t* validate_millerable_object(json_value_t* pjson, char* flatten_sep, int j case JSON_OBJECT: // This could be made more efficient ... the string length is in the json_value_t. prefix = mlr_paste_2_strings(key, flatten_sep); - populate_from_nested_object(prec, pjson_value, prefix, flatten_sep); + populate_from_nested_object(prec, pjson_value, prefix, flatten_sep, json_skip_arrays_on_input); free(prefix); break; case JSON_ARRAY: @@ -104,7 +105,10 @@ lrec_t* validate_millerable_object(json_value_t* pjson, char* flatten_sep, int j // Example: the JSON object has { "a": { "b" : 1, "c" : 2 } }. Then we add "a:b" => "1" and "a:c" => "2" // to the lrec. -static void populate_from_nested_object(lrec_t* prec, json_value_t* pjson_object, char* prefix, char* flatten_sep) { +// xxx retval +static void populate_from_nested_object(lrec_t* prec, json_value_t* pjson_object, char* prefix, char* flatten_sep, + int json_skip_arrays_on_input) +{ int n = pjson_object->u.object.length; for (int i = 0; i < n; i++) { json_object_entry_t* pobject_entry = &pjson_object->u.object.p.values[i]; @@ -128,14 +132,69 @@ static void populate_from_nested_object(lrec_t* prec, json_value_t* pjson_object break; case JSON_OBJECT: prefix = mlr_paste_2_strings(lrec_key, flatten_sep); - populate_from_nested_object(prec, pjson_value, prefix, flatten_sep); + populate_from_nested_object(prec, pjson_value, prefix, flatten_sep, json_skip_arrays_on_input); free(prefix); free(lrec_key); break; case JSON_ARRAY: - fprintf(stderr, - "%s: found array item within JSON object. This is valid but unmillerable JSON.\n", - MLR_GLOBALS.bargv0); + if (!json_skip_arrays_on_input) { + fprintf(stderr, + "%s: found array item within JSON object. This is valid but unmillerable JSON.\n", + MLR_GLOBALS.bargv0); + } + break; + case JSON_INTEGER: + lrec_put(prec, lrec_key, pjson_value->u.integer.sval, FREE_ENTRY_KEY); + break; + case JSON_DOUBLE: + lrec_put(prec, lrec_key, pjson_value->u.dbl.sval, FREE_ENTRY_KEY); + break; + default: + MLR_INTERNAL_CODING_ERROR(); + break; + } + + } +} + +// xxx retval +/*xxx temp static*/ +void populate_from_nested_array(lrec_t* prec, json_value_t* pjson_array, char* prefix, char* flatten_sep, + int json_skip_arrays_on_input) +{ + int n = pjson_array->u.array.length; + for (int i = 0; i < n; i++) { + json_value_t* pjson_value = &pjson_array->u.array.p.values[i]; + // xxx char* json_key = (char*)pobject_entry->name; + char* json_key = "temp"; // xxx temp + char* lrec_key = mlr_paste_2_strings(prefix, json_key); + char* prefix = NULL; + + switch (pjson_value->type) { + case JSON_NONE: + lrec_put(prec, lrec_key, "", FREE_ENTRY_KEY); + break; + case JSON_NULL: + lrec_put(prec, lrec_key, "", FREE_ENTRY_KEY); + break; + case JSON_STRING: + lrec_put(prec, lrec_key, pjson_value->u.string.ptr, FREE_ENTRY_KEY); + break; + case JSON_BOOLEAN: + lrec_put(prec, lrec_key, pjson_value->u.boolean.sval, FREE_ENTRY_KEY); + break; + case JSON_OBJECT: + prefix = mlr_paste_2_strings(lrec_key, flatten_sep); + populate_from_nested_object(prec, pjson_value, prefix, flatten_sep, json_skip_arrays_on_input); + free(prefix); + free(lrec_key); + break; + case JSON_ARRAY: + if (!json_skip_arrays_on_input) { + fprintf(stderr, + "%s: found array item within JSON object. This is valid but unmillerable JSON.\n", + MLR_GLOBALS.bargv0); + } break; case JSON_INTEGER: lrec_put(prec, lrec_key, pjson_value->u.integer.sval, FREE_ENTRY_KEY); diff --git a/c/todo.txt b/c/todo.txt index 3805894bd..458935b46 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -8,7 +8,7 @@ BUGFIXES ! windows port -! eddelbuettel ac error <-> smith aclocal-1.15? +* eddelbuettel ac error <-> smith aclocal-1.15? * --mmap / --no-mmap double-regression loop o also "." the setup funcs diff --git a/doc/content-for-faq.html b/doc/content-for-faq.html index 162b8fa57..d41f2955b 100644 --- a/doc/content-for-faq.html +++ b/doc/content-for-faq.html @@ -85,6 +85,43 @@ POKI_RUN_COMMAND{{echo x,y,z | mlr --dkvp rename 2,999}}HERE POKI_RUN_COMMAND{{echo x,y,z | mlr --dkvp rename 2,newname}}HERE POKI_RUN_COMMAND{{echo x,y,z | mlr --csv --implicit-csv-header reorder -f 3,1,2}}HERE + +
+$a = "It's OK, I said, then 'for now'." ++
+$ echo a=bcd | mlr put -f data/single-quote-example.mlr +a=It's OK, I said, then 'for now'. ++
+$ echo a=bcd | mlr put '$a="It'\''s OK, I said, '\''for now'\''."' +a=It's OK, I said, 'for now'. ++