Skip to content

Converting JsonValue to String #39

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

Open
heykirby opened this issue Jan 23, 2024 · 14 comments
Open

Converting JsonValue to String #39

heykirby opened this issue Jan 23, 2024 · 14 comments

Comments

@heykirby
Copy link

Simdjson cannot compress structures
for example json
{ "field1": { "field2": "xx" } }
I cannot get the compressed value for field1, value is { "field2": "xx" }

@piotrrzysko
Copy link
Member

Do I understand correctly that you would like to read the value of field1 as a string? Something like this:

JsonValue json = parser.parse(...);
Iterator<Map.Entry<String, JsonValue>> it = json.objectIterator();
Map.Entry<String, JsonValue> field1 = it.next();
System.out.println(field1.getValue().asString()); // this prints '{ "field2": "xx" }'

@heykirby
Copy link
Author

heykirby commented Feb 20, 2024

yes, it looks like simdjson has implemented this capability,thanks

@andyglow
Copy link

andyglow commented Feb 21, 2024

for me field1.getValue().asString() doesn't work if the value is either <array> or <object>
gets me something like this instead

Caused by: java.lang.StringIndexOutOfBoundsException: Range [3198, 3198 + 1952541807) out of bounds for length 35651584
         at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
         at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
         at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
         at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
         at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
         at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromIndexSize(Preconditions.java:118)
         at java.base/jdk.internal.util.Preconditions.checkFromIndexSize(Preconditions.java:397)
         at java.base/java.lang.String.checkBoundsOffCount(String.java:4849)
         at java.base/java.lang.String.<init>(String.java:522)
         at org.simdjson.JsonValue.getString(JsonValue.java:87)
         at org.simdjson.JsonValue.asString(JsonValue.java:81)

@piotrrzysko
Copy link
Member

The snippet I provided in the previous comment was just to verify if I understand the issue correctly. I'm not saying that currently this line works according to the comment:

System.out.println(field1.getValue().asString()); // this prints '{ "field2": "xx" }'

@andyglow
Copy link

gotcha. are there plans to make asString handle these scenarios, @piotrrzysko ?
in some cases it would be great to be able to reuse original slice of buffer to stringify the value instead of building a new one traversing the value

@piotrrzysko
Copy link
Member

I think we can try to add it. However, I'm currently busy working on #35, so I can't promise when I'll be able to do that.

@andyglow
Copy link

andyglow commented Mar 5, 2024

I see. That would be wonderful if you could make it happen at some point. I'll be waiting for it :)

@andyglow
Copy link

andyglow commented Sep 9, 2024

hello @piotrrzysko. a gentle reminder that this feature still highly anticipated and appreciated :)

@heykirby
Copy link
Author

heykirby commented Oct 8, 2024

@andyglow refer to #59 ,it works for us,and might work for you too

@piotrrzysko piotrrzysko changed the title Simdjson cannot compress structures Converting JsonValue to String Oct 20, 2024
@matkt
Copy link

matkt commented Feb 20, 2025

I’m really interested in this project and was wondering if there’s been any progress on this issue or if someone is currently working on it. The ability to convert to a string would be extremely helpful.
Thanks for your hard work and for any update you can provide!

@heykirby
Copy link
Author

I’m really interested in this project and was wondering if there’s been any progress on this issue or if someone is currently working on it. The ability to convert to a string would be extremely helpful. Thanks for your hard work and for any update you can provide!

#63 hello,it may be work for you

@piotrrzysko
Copy link
Member

The ability to convert to a string would be extremely helpful.

Just out of curiosity: why could this feature be useful? What are the use cases?

@heykirby
Copy link
Author

heykirby commented Feb 27, 2025

The ability to convert to a string would be extremely helpful.

Just out of curiosity: why could this feature be useful? What are the use cases?

hello,piotrrzysko,use cases can be found in #63 src/test/java/org/simdjson/demand/PathsBasedTest.java.
When constructing an instance of PathsBasedJsonParser, simply pass the path to be parsed as a constructor argument. If the corresponding path is of type map or array, it will automatically be compressed into a string. Both keys and indexes of maps and arrays are supported in the paths to be parsed
for example, json like

Image
PathsBasedJsonParser parser = new PathsBasedJsonParser("a.b", "a.b.c", "d.[0]", "d", "d.[0].f");   
String[] values = parser.parse(json);  
// values = ["{\"c\":\"value1\"}", "value1", "{\"e\":1}", "[{\"e\":1},{\"f\":2.1}]", "2.1"]  

you can also specify the type of the value you want to parse. This is useful when you want to ensure that the value you are parsing is of a certain type, string type default if not assign.

PathsBasedJsonParser parser = new PathsBasedJsonParser( "d.[0].e:INT", "d.[0].f:DOUBLE");  
Object[] values = parser.parse(json);  
// values = [1, 2.1]. 

it's important to note that when referring to array indices, they should be enclosed within square brackets []. If a map key contains square brackets, they need to be written twice as a backslash is used to escape them.
for example,if json like this,we can get $.a.[b.c] like

Image
PathsBasedJsonParser parser = new PathsBasedJsonParser( "a.[[b.c]]");  
String[] values = parser.parse(json);  
// values = ["value1"]. 

@andyglow
Copy link

could be useful in http proxy like scenario where only some nested (no matter how they look) parts of the input got transferred down the path

some ETL pipelines may work that way

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

4 participants