You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by "Thiago Henrique De Paula Figueiredo (Jira)" <ji...@apache.org> on 2023/02/01 19:14:00 UTC

[jira] [Commented] (TAP5-2747) KeyPath-based traversal of JSONCollection

    [ https://issues.apache.org/jira/browse/TAP5-2747?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17683134#comment-17683134 ] 

Thiago Henrique De Paula Figueiredo commented on TAP5-2747:
-----------------------------------------------------------

Hello, [~ben-ng] and [~bobharner]!

This is an interesting discussion about what makes sense to be included in Tapestry vs not included or included in a 3rd party library. On the one hand, it's nice to have more features. On the other hand, it's more code for us to support.

In this specific case, much like Tapestry's own prop binding, I support having a limited, intentionally simple JSON keypath syntax that covers just frequent and common cases. Some additional thoughts:
# I'm not sure why the array.[0] syntax exists. And, if it needs to exists, I wouldn't use .[], since I think it's confusing considering we have . and [] operators in the syntex already.
# Instead of outer.nonExistant?, I'd use outer?.nonExistant for consistency with the prop binding

> KeyPath-based traversal of JSONCollection
> -----------------------------------------
>
>                 Key: TAP5-2747
>                 URL: https://issues.apache.org/jira/browse/TAP5-2747
>             Project: Tapestry 5
>          Issue Type: New Feature
>          Components: tapestry-json
>    Affects Versions: 5.8.2
>            Reporter: Ben Weidig
>            Assignee: Ben Weidig
>            Priority: Minor
>
> As navigation nested {{JSONObject}} structures can be tedious, so I propose adding a String-based KeyPath traversal system.
> For example:
> {code:java}
> JSONObject json = ...
> // {
> //   outer: { inner: "here" },
> //   array: [
> //     1,
> //     { innerArray: ["A", "B", "C"] },
> //     ["Z", "Y", "X"]
> //   ]
> // }
> var result = json.getByKeyPath("array[1].innerArray[5]?");
> // Equivalent to
> var result = json.getByKeyPath("array.[1].innerArray.[5]?");{code}
>  
> The {{getByKeyPath}} method returns an Object, but the other types are available, too.
> The following types of keypaths should be supported:
>  * {{JSONObject}} navigation, e.g. {{outer.inner -> "here"}}
>  * {{JSONArray}} indices, e.g. {{array[0] -> 1}}
>  * {{JSONArray}} indices without key, e.g. {{array.[0] -> 1}}
>  * Optionality, e.g, {{outer.nonExistant? -> null}}
> The different types are combinable as needed.
> By default, the KeyPath is delimited by "." but there should also be a {{getByKeyPath(String getKeyPath, String delimiter)}} to support "." in JSON keys.
> I already have a proof-of-concept working. However, it requires some cleanup and a lot of testing before being ready.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)