-
Notifications
You must be signed in to change notification settings - Fork 641
Design a general JsonElement-like thing? #1573
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
Comments
This one is similar: #222 |
#222 is more likely to request a SAX-style reader but I’m asking a generic DOM.
|
It is about a generic tree-like object with string keys. I actually use exactly that in DataForge. But it is tailored for my own needs. I use it for DOM as well and it could be encoded to Json or XML. |
My 5 cents. All formats listed here: YAML, Cbor, MessagePack are based on JSON data information model, so using a |
@elizarov What's more, the current architecture of |
@elizarov the primary difference between JSON and XML is the treatment of same-name-siblings. In Json it is array, in XML, element order matters. I agree that the model is different, but in theory, it is possible to make some kind of common tooling to work with any tree-like structure. |
We can design a |
In a concrete example: data class Request(val identity: GeneralElement, val arg: String)
data class Response(val identity: GeneralElement, val result: String)
fun handleRequest(request: Request): Response {
return Response(request.identity, "Hello, " + request.arg)
} |
As an incremental step it would be very helpful to break out the JsonElement classes and utility functions into a separate, independent, dependency. This would help json5k xn32/json5k#2 so it's possible to encode/decode to/from JsonElements, but does not require muddying the JSON5 code with KxS JSON serialization. |
@aSemy I doubt this is worth it or even possible, because JsonElements serializers heavily rely on functionality specific to Json format (see JsonEncoder and JsonDecoder) |
(This comment is very much related to #222 ) We keep hitting issues due to the limitations of the decoder (see here, for example, but we've also faced this before and the ISO mDL spec already requires us to use an alternative to the upstream KxS CBOR codec for similar reasons). Let's face it: There are specs out there that demand parsing onto generic structures. These specs are
Just looking at the EUDIW this amounts the whole population of the European Union being eligible for digital identity documents, that require parsing CBOR into a generic tree structure. I am not trying to badmouth the default KxS format, or anyone involved with it. I am just raising the point that a feature that used to be nice-to-have has become essential for real-world applications that are here to stay, affecting a user base of hundreds of millions. |
Looking just at the difference between XML and Json from a format perspective I don't think it is even possible to have a generic data structure that could be a format agnostic general data storage. The "easier" case is serialization, but it would still requiring providing the descriptor on replay to allow for a serializer to "replay" the events. Needing the descriptor is not generic. Deserialization is still more challenging. Keep in mind that formats use the serial descriptors to determine how to serialize/interpret deserialized content. Maybe an extreme example of that is protobuf where nested objects are just byteranges and the schema is needed to interpret it. |
Too generic probably won't work, but as @elizarov pointed out, CBOR and Json share a lot, but CBOR is more powerful, so unifying at least those two formats would make sense in the long run. Feature-Wise and structurally, I'd say JSON is a strict subset of CBOR. |
Even so, designing a generic component solely for JSON-like models is still practical enough. In the real world, we already have multiple formats that adopt JSON-like models - such as YAML/Cbor/Message Pack/TOML, etc., which are widely used. |
@JesusMcCloud @ArcticLampyrid There is nothing against the idea to have shared generic components. Thinking about the implementation it requires either the custom serializers to each specific supported format (e.g. using |
@JesusMcCloud There's a big difference between 'Design a general generic tree structure' and 'Expand JsonElement to be a CborElement' tasks. The first one has a very broad scope with a lot of design space and unanswered questions. The second has a clear scope and applications. This ticket is left open for more theoretic discussions; I doubt it would be implemented someday. For CborElement, though, you can open a separate one with a list of examples from EU regulations. We can discuss there whether some parts of Obor can be upstreamed or some other solution is required. |
We have this bug here and we have #222. I agree that there are things being mixed up, but it was hinted here that combining json an cbor generic structures would make sense. So the new issue will be about which scope, exactly? JSON+CBOR is a given, YAML? what else? |
I think this needs some guidance on how to progress without cluttering the issue tracker even more. We currently have:
The last bullet deserves a separate issue, as it is COSE-specific and comes down to the ISO watering-down the strict COSE encoding rules. I will need some time to properly prepare it though, because:
ping @thecyberfred |
Write-up is done. see #2975 |
Currently the
JsonElement
is very specific toJson
, however the similar feature can be used in other formats likeCtor
,Yaml
,MessagePack
, etc.What is your use-case and why do you need this feature?
Similarly to
JsonElement
, sometimes we may need to process the complex struct manually.We may provide response for our api in multi formats (eg.
Json
for normal use &Ctor
for better performance), then we need a more general way to handlexxxElement
.For a detailed example, all Discord APIs support both
Json
andETF
encodings.Describe the solution you'd like
The fundamental
GeneralElement
should be designed asRawMessage
(inspired by Golang), which stores the values in a serializator-special binary format. This data may not have a clear TypeID, so we may not able to read or edit it without addtional information. But round-trip should be supported.RawMessage
is compatible toProtobuf
or other formats that do not have a clear runtime type info.Some formats like
Json
orCtor
provides detailed type info to help us parse the data, then we can parse them intoGeneralObjectElement
,GeneralArrayElement
orGeneralPrimitiveElement
, which generalizdJsonObject
,JsonArray
andJsonPrimitive
.The text was updated successfully, but these errors were encountered: