Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow arrays to be pretty-printed with more than one element per line. #795

Open
dbrouwer3563 opened this issue Nov 11, 2022 · 2 comments
Open

Comments

@dbrouwer3563
Copy link

Feature Request
When json-c converts a json array to a json string and the flag 'JSON_C_TO_STRING_PRETTY' is used, it inserts a newline after every array element.

If the array is a long array filled with integers, it can be tedious to scroll down to view the entire array.
A good solution would be to use the default flag 'JSON_C_TO_STRING_PLAIN' to print the array all on one line. But if the array is nested within a json object that includes other objects that are not arrays then the 'JSON_C_TO_STRING_PRETTY' flag seems to be needed to preserve the pretty formatting for the other objects.

Example:

{
  "test1":{
    "test2":{
      "test3":"test3"
    }
  },
  "my_long_array":[
    0,
    1,
    2,
    3,
    4,
    5,
<snip>
    250,
    251,
    252,
    253,
    254
  ]
}

Steps To Reproduce

json_object *parent = json_object_new_object();
struct json_object *test1 = json_object_new_object();
struct json_object *test2 = json_object_new_object();
json_object_object_add(test2, "test3", json_object_new_string("test3"));
json_object_object_add(test1, "test2", test2);
json_object_object_add(parent, "test1", test1);

json_object *my_long_array = json_object_new_array();
for (int i = 0; i < 255; i++)
	json_object_array_add(my_long_array, json_object_new_int(i));
json_object_object_add(parent, "my_long_array", my_long_array);

printf("%s\n", json_object_to_json_string_ext(parent, JSON_C_TO_STRING_PRETTY));

Would it be possible to have a new pretty-print format that prints n-number of array elements per line? While still preserving pretty format for the non-array objects within an object? So the result would look something like this:

{
  "test1":{
    "test2":{
      "test3":"test3"
    }
  },
  "my_long_array":[
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
    30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,
    57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
    84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,
    108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
    128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,
    148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,
    168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,
    188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
    208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,
    228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
    248,249,250,251,252,253,254
    ]
}

Version and Platform

  • json-c version: json-c 0.16-1
  • OS: Arch
  • Custom cmake/build flags: none
@hawicz
Copy link
Member

hawicz commented Nov 30, 2022

Possible? Theoretically, sure. Possible without hardcoding some arbitrary line length, and while doing something sensible with array elements that aren't simple numbers or strings? Well, that's a bit harder.
The code changes would be around the line that adds the "\n": https://github.com/json-c/json-c/blob/master/json_object.c#L1389, but the exactly logic to decide when to add the newline or not will take some work to figure out.
And, of course, we need some way in the API to specify the line length to use.
If you have some ideas about how this might work feel free to expand and refine on your initial example, above.

dbrouwer3563 pushed a commit to dbrouwer3563/json-c that referenced this issue Jan 6, 2023
This flag is the same as JSON_C_TO_STRING_PRETTY except that arrays will
print up to 15 elements per line instead of just 1 element per line.
This flag only works with elements that are of the json_type null,
boolean, double, or int. Issue json-c#795.

Signed-off-by: Deborah Brouwer <deborah.brouwer@collabora.com>
@dbrouwer3563
Copy link
Author

@hawicz thanks for reviewing this request. I opened the merge request so you can see my thinking, but am open to discussing all of it. TL;DR I hardcoded some arbitrary line length of 15 elements and restricted the flag to array elements that are only of the type null, bool, int or double.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants