I want to match the element with "mailReceiverList" with a regular expression:
{
"parameterName": "mailTemplate",
"valueType": "STRING",
"parameterValue": null,
"parameterType": "STANDARD"
},
{
"parameterName": "mailReceiverList",
"valueType": "STRING",
"parameterValue": "anything",
"parameterType": "STANDARD"
},
{
"parameterName": "mailMessage",
"valueType": "STRING",
"parameterValue": "something",
"parameterType": "STANDARD"
}
]
I tried with regextester.com:
/,{"parameterName":"mailReceiverList",(.*)}/
But it matches also "mailMessage" element.
How to find first following occurence of "}"?
CodePudding user response:
Found it on my own:
/,{"parameterName":"mailReceiverList",[^}]*}/
CodePudding user response:
JSON-parsing and locate an element inside the array.
Given your JSON as string (minified with to be compact in one line):
jsonText = "[{"parameterName":"mailTemplate","valueType":"STRING","parameterValue":null,"parameterType":"STANDARD"},{"parameterName":"mailReceiverList","valueType":"STRING","parameterValue":"anything","parameterType":"STANDARD"},{"parameterName":"mailMessage","valueType":"STRING","parameterValue":"something","parameterType":"STANDARD"}]"
Use Convert JSON to String Online to minify to String (with double-quotes escaped).
in Javascript
See JSON.parse()
Example:
const jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]";
let elements = JSON.parse(jsonText); // parse JSON-string
console.log("elements size:", elements.length); // verify all read
// find desired element
let mailReceiverListElement = elements.filter(e => e.parameterName == "mailReceiverList")[0];
console.log("found it:", mailReceiverListElement);
in Java
Use Jackson as in How to parse a JSON string to an array using Jackson:
// the class is needed as object for array-elements
public class Element {
String parameterName;
String valueType;
String parameterValue;
String parameterType;
public static void main(String[] args) {
String jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]";
// parse JSON-string to Java array of class Element
ObjectMapper mapper = new ObjectMapper();
Element[] elements = (Element[]) mapper.readValue(jsonText, new TypeReference<Element[]>(){});
System.out.println(elements.length); // verify all read
// filter array elements for desired one
for (Element e : elements) {
if ("mailReceiverList".equals(e.parameterName)) {
System.out.println("Found it: " e.parameterValue);
}
}
}
}
in Python
import json
jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]"
# parse JSON text
elements = json.loads(jsonText) # as list of dicts
print(len(elements)) # verify all read
# filter list elements for desired one
for e in elements:
if e['parameterName'] == 'mailReceiverList':
print('found it:', e)
Prints:
3
('found it:', {u'parameterType': u'STANDARD', u'parameterName': u'mailReceiverList', u'valueType': u'STRING', u'parameterValue': u'anything'})
CodePudding user response:
I would use this regex:
/{"parameterName":"mailReceiverList",[^{]*}/
Without the leading comma, so you are not dependent on the order of the returned array.
