JSONPath pattern - keeping object structure - json

I'm having a bit of trouble doing something with JSONPath. This is what I have:
[
{
"id": {
"type": "literal",
"value": "123456789",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
},
"name": {
"type": "literal",
"value": "John Doe",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
}
},
{
"id": {
"type": "literal",
"value": "2123456789",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
},
"name": {
"type": "literal",
"value": "Jane Doe",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
}
}
]
}
]
And what I would like to get after applying a pattern is:
[
{
"id": "123456789",
"name": "John Doe"
},
{
"id": "2123456789",
"name": "Jane Doe"
}
]
Is this possible? The best I am doing is ["123456789", "John Doe","2123456789","Jane Doe"]
How should the pattern look like?

With DefiantJS (http://defianjs.com), you can query JSON structure using XPath expressions. DefiantJS extends the global object JSON with the method "search" and it returns matches as an array-like object.
Here is an example code;
var data = [
{
"id": {
"type": "literal",
"value": "123456789",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
},
"name": {
"type": "literal",
"value": "John Doe",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
}
},
{
"id": {
"type": "literal",
"value": "2123456789",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
},
"name": {
"type": "literal",
"value": "Jane Doe",
"datatype": "http://www.w3.org/2001/XMLSchema#string"
}
}
],
found = JSON.search(data, '//value'),
str = '';
for (var i=0; i<found.length; i++) {
str += found[i] +'<br/>';
}
document.getElementById('output').innerHTML = str;
To see this code in action, check out this fiddle; http://jsfiddle.net/hbi99/4BZMm/
For more useful XPath expressions, see the like XPath Evaluator here; http://defiantjs.com/#xpath_evaluator

Related

Add some property in the String so response like this

Hi i want to add some property in the give json string at the time of creating record
So this is my give Json String
{
"id": "123",
"type": "Red",
"bn": "TTY",
"isp": {
"object": "obj202",
"time": "19:30",
"providedBy": {
"object": "obj201"
}
},
"seed":35,
"tem": {
"value": 25,
"time": "20:20",
"uc": "CEL"
},
"loc": {
"value": {
"type": "p",
"coor": [
2.6,
9.6
]
}
}
}
IN this string i want to add type so response like this
{
"id": "123",
"type": "Red",
"bn": {
"type": "P",
"value": "TTY"
},
"isp": {
"type": "R",
"providedBy": {
"type": "R",
"object": "obj201"
},
"object": "obj202"
},
"seed": {
"type": "P",
"value": 85
},
"tem": {
"type": "P",
"value": 25,
"time": "20:20",
"uc": "CEL"
},
"location": {
"type": "GP",
"value": {
"type": "P",
"coor": [
2.6,
9.6
]
}
}}
so please guide me how to do this without using ObjectMapper class in the code
please provide the code

Get JSON value based on the value in a sub-node

The following JSON payload is attached to the Webhook when someone submits a form.
{
"event_id": "01G9HND6HYK185YMA9Z5CZ3BV0",
"event_type": "form_response",
"form_response": {
"form_id": "cvjMXer8",
"token": "01G9HND6HYK185YMA9Z5CZ3BV0",
"landed_at": "2022-08-03T10:53:16Z",
"submitted_at": "2022-08-03T10:53:16Z",
"definition": {
"id": "cvjMXer8",
"title": "My Test Form",
"fields": [
{
"id": "AfpCiPiAmHjD",
"ref": "01G76Q8G8SWQMYAD3T4SWCBEQ4",
"type": "opinion_scale",
"title": "Hur nöjd är du?",
"properties": {}
},
{
"id": "KQlkSr1mg6ge",
"ref": "966e1df9-e9a5-4243-80f7-c0db86f2b705",
"type": "short_text",
"title": "Skriv vad du tycker",
"properties": {}
},
{
"id": "LGTRVpqJ5cOy",
"ref": "03278ed7-f602-465d-b7ec-667d486f937a",
"type": "multiple_choice",
"title": "Välj ett nummer mellan 1 och 4",
"properties": {},
"choices": [
{
"id": "wcwXgizdXJFQ",
"label": "1"
},
{
"id": "lTzi4WiQjEuo",
"label": "2"
},
{
"id": "uq6kPQTEutof",
"label": "3"
},
{
"id": "FI0JDCaXBaZE",
"label": "4"
}
]
}
]
},
"answers": [
{
"type": "number",
"number": 42,
"field": {
"id": "AfpCiPiAmHjD",
"type": "opinion_scale",
"ref": "01G76Q8G8SWQMYAD3T4SWCBEQ4"
}
},
{
"type": "text",
"text": "Lorem ipsum dolor",
"field": {
"id": "KQlkSr1mg6ge",
"type": "short_text",
"ref": "966e1df9-e9a5-4243-80f7-c0db86f2b705"
}
},
{
"type": "choice",
"choice": {
"label": "Barcelona"
},
"field": {
"id": "LGTRVpqJ5cOy",
"type": "multiple_choice",
"ref": "03278ed7-f602-465d-b7ec-667d486f937a"
}
}
]
}
}
The answers are inside the node form_response.answers. As we see, there are three answers posted, each with a somewhat different structure based on the type of question. To collect the correct value, I should first look at the field.id to know which question this answer corresponds to.
E.g. If field.id = "AfpCiPiAmHjD" then I know I should pick up the value 42 from its parent node.
What value should I write in a Power Automate flow to fetch this value using a Variable step?

jq sort by value of key

Given the following JSON (oversimplified for the sake of the example), I need to order the keys by their value. In this case, the order should be id > name > type.
{
"link": [{
"attributes": [{
"value": "ConfigurationElement",
"name": "type"
}, {
"value": "NAME1",
"name": "name"
}, {
"value": "0026a8b4-ced6-410e-9213-e3fcb28b3aab",
"name": "id"
}
],
"href": "href1",
"rel": "down"
}, {
"attributes": [{
"value": "0026a8b4-ced6-410e-9213-k23g15h2u1l5",
"name": "id"
}, {
"value": "ConfigurationElement",
"name": "type"
}, {
"value": "NAME2",
"name": "name"
}
],
"href": "href2",
"rel": "down"
}
],
"total": 2
}
EXPECTED RESULT:
{
"link": [{
"attributes": [{
"value": "0026a8b4-ced6-410e-9213-e3fcb28b3aab",
"name": "id"
}, {
"value": "NAME1",
"name": "name"
}, {
"value": "ConfigurationElement",
"name": "type"
}
],
"href": "href1",
"rel": "down"
}, {
"attributes": [{
"value": "0026a8b4-ced6-410e-9213-k23g15h2u1l5",
"name": "id"
}, {
"value": "NAME2",
"name": "name"
}, {
"value": "ConfigurationElement",
"name": "type"
}
],
"href": "href2",
"rel": "down"
}
],
"total": 2
}
I would be very grateful if anyone could help me out. I tried jq with -S and -s with sort_by(), but this example is way too complex for me to figure it out with my current experience with jq. Thank you a lot!
You can do:
jq '.link[].attributes|=sort_by(.name)'
The |= takes all the paths matched by .link[].attributes, i.e. each "attributes" array, and applies the filter sort_by(.name) to each of them, leaving everything else unchanged.

Extract values in json object with awk/sed, but cannot get it to work

I have a file with the return of a curl statement in it, in the form of json. Each object has a set of values, but the parameters for these values are all called the same names. See code below.
These objects are part of a larger object called workflow. The Cleaning up object is the last process that runs in our workflow. For every video that passes through the workflow, a json file in this format is created. (There are more than only these three objects, this is just for illustrative purposes)
I want to take the value of completed of the object with "description": "Cleaning up" and store it as a variable $end_time. Then I want to take the value of completed of the object with "description": "Ingest" and store it as a variable $start_time. These two values are then subtracted to give me an integer time in milliseconds so I can calculate the time it took for the video to go through this part of the process. With the maths part I am fine, and know how to do it. It is the extraction of the values that I am struggling with.
I hope this makes sense? ANY help would be appreciated. Thank you in advance!
EDIT: Had to delete original code in post, due to character limitations
Here is a proper example of the file that I have to work with:
{
"workflows": {
"count": "20",
"searchTime": "1",
"startPage": "0",
"totalCount": "1",
"workflow": {
"configurations": {
"configuration": [
{
"$": "1409750880000",
"key": "schedule.start"
},
{
"$": "1409755980000",
"key": "schedule.stop"
},
{
"$": "Capture_agent",
"key": "schedule.location"
},
{
"$": "false",
"key": "trimHold"
},
{
"$": "true",
"key": "archiveOp"
},
{
"$": "false",
"key": "captionHold"
},
{
"$": "false",
"key": "videoPreview"
}
]
},
"creator": {
"organization": "mh_default_org",
"roles": [
"76b1bdde-a080-40a4-b929-bde89af6a0a8_Instructor",
"ROLE_ADMIN",
"ROLE_ANONYMOUS",
"ROLE_USER"
],
"userName": user_name
},
"description": "This workflow definition defines the steps involved in scheduling a recording, capturing it, and\n ingesting it, after which processing operations may be added.\n ",
"errors": "",
"id": "15518",
"mediapackage": {
"attachments": "",
"creators": {
"creator": "Name"
},
"id": "2d25ed19-2978-458d-a4a0-c9c56d791c68",
"license": "Creative Commons 3.0: Attribution-NonCommercial-NoDerivs",
"media": "",
"metadata": "",
"publications": {
"publication": {
"channel": "engage-player",
"id": "b7b68f91-2c33-4673-ba7c-2e9b891788f9",
"mimetype": "text/html",
"tags": "",
"url": "http://some.url.com:80/engage/ui/watch.html?id=2d25ed19-2978-458d-a4a0-c9c56d791c68"
}
},
"series": "76b1bdde-a080-40a4-b929-bde89af6a0a8",
"seriestitle": "Recording_Title_user_name",
"start": "2014-09-03T13:28:00Z",
"title": "Recording_Title"
},
"operations": {
"operation": [
{
"abortable": "false",
"completed": 1409750882092,
"configurations": {
"configuration": [
{
"$": "1409750880000",
"key": "schedule.start"
},
{
"$": "1409755980000",
"key": "schedule.stop"
},
{
"$": "Capture_agent",
"key": "schedule.location"
}
]
},
"continuable": "false",
"description": "Scheduled",
"execution-history": "",
"execution-host": "http://some.url.com:8080",
"fail-on-error": "true",
"failed-attempts": "0",
"hold-action-title": "View schedule",
"holdurl": "/workflow/hold/org.opencastproject.workflow.handler.scheduleworkflowoperationhandler",
"id": "schedule",
"job": "15519",
"max-attempts": "1",
"retry-strategy": "none",
"started": 1409750881745,
"state": "SUCCEEDED",
"time-in-queue": 0
},
{
"abortable": "false",
"configurations": "",
"continuable": "false",
"description": "Capture",
"execution-history": "",
"execution-host": "http://some.url.com:8080",
"fail-on-error": "true",
"failed-attempts": "0",
"hold-action-title": "Monitor capture",
"holdurl": "/workflow/hold/org.opencastproject.workflow.handler.captureworkflowoperationhandler",
"id": "capture",
"job": "42894",
"max-attempts": "1",
"retry-strategy": "none",
"started": 1409750884085,
"state": "SKIPPED",
"time-in-queue": 0
},
{
"completed": 1409756171224,
"configurations": "",
"description": "Ingest",
"execution-history": "",
"fail-on-error": "true",
"failed-attempts": "0",
"id": "ingest",
"max-attempts": "1",
"retry-strategy": "none",
"state": "SUCCEEDED"
},
{
"completed": 1409854379552,
"configurations": {
"configuration": {
"key": "preserve-flavors"
}
},
"description": "Cleaning up",
"execution-history": "",
"execution-host": "http://some.url.com:8080",
"fail-on-error": "false",
"failed-attempts": "0",
"id": "cleanup",
"job": "45113",
"max-attempts": "1",
"retry-strategy": "none",
"started": 1409854378128,
"state": "SUCCEEDED",
"time-in-queue": 0
}
]
},
"organization": {
"adminRole": "ROLE_ADMIN",
"anonymousRole": "ROLE_ANONYMOUS",
"id": "mh_default_org",
"name": "Opencast Project",
"properties": {
"property": [
{
"$": "true",
"key": "adminui.i18n_tab_episode.enable"
},
{
"$": "false",
"key": "adminui.i18n_tab_users.enable"
},
{
"$": "/engage/ui/img/mh_logos/OpencastLogo.png",
"key": "logo_small"
},
{
"$": "http://opencast.org/matterhorn/",
"key": "engageui.link_mobile_redirect.url"
},
{
"$": "false",
"key": "engageui.annotations.enable"
},
{
"$": "true",
"key": "engageui.links_media_module.enable"
},
{
"$": "2024",
"key": "adminui.chunksize"
},
{
"$": "false",
"key": "adminui.series_prepopulate.enable"
},
{
"$": "true",
"key": "engageui.link_download.enable"
},
{
"$": "false",
"key": "engageui.link_mobile_redirect.enable"
},
{
"$": "For more information have a look at the official site.",
"key": "engageui.link_mobile_redirect.description"
},
{
"$": "/engage/ui/img/mh_logos/MatterhornLogo_large.png",
"key": "logo_large"
}
]
},
"servers": {
"server": {
"name": "localhost",
"port": "8080"
}
}
},
"parent": {
"nil": "true"
},
"state": "SUCCEEDED",
"template": "full",
"title": "Scheduled Workflow"
}
}
}
Here is a jq example that should point you to getting what you want:
#!/bin/bash
# Assuming the json is in a file workflow.json
end_time=$( jq '.workflows.workflow.operations.operation[] | select(.description == "Cleaning up") | .completed' < workflow.json )
start_time=$( jq '.workflows.workflow.operations.operation[] | select(.description == "Ingest") | .completed' < workflow.json )
This is assuming the input you have is in an JSON array called workflow at the top level. Here's this on the command line:
$ jq '.workflows.workflow.operations.operation[] | select(.description == "Ingest") | .completed' < workflow.json
1406051539118
$ jq '.workflows.workflow.operations.operation[] | select(.description == "Cleaning up") | .completed' < workflow.json
1406051695440

json parsererror

why this error
xhr: [object XMLHttpRequest]
textStatus: parsererror
errorThrown: Invalid JSON: [ { "id": "10000000", "label": "10000000" }, { "id": "10000001", "label": "10000001" }, { "id": "10000003", "label": "10000003" }, { "id": "10000005", "label": "10000005" }, { "id": "10000006", "label": "10000006" } ]
Copied and pasted this:
[ { "id": "10000000", "label": "10000000" }, { "id": "10000001", "label": "10000001" }, { "id": "10000003", "label": "10000003" }, { "id": "10000005", "label": "10000005" }, { "id": "10000006", "label": "10000006" }]
to JSONlint and it says it's valid.
Can you post the original JSON if that is the original then the it is missing a root key
var textStatus = {"keys":[{"id":"...", "label":"..."},{"id":"...","label":"..."}]}
Also the whole thing needs to be inside {} to make it an object what you had is just an array