Разобрать объект JSON со значением как строковый массив JSON - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь проанализировать строку JSON следующего формата

{"edgeNodeRegistrationStatus": ["{\"CONFIRMED\":\"TRUE\"}"]}

Я написал код для ее анализа.

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

def jsonSlurper = new JsonSlurper()

def object = jsonSlurper.parseText('{"edgeNodeRegistrationStatus": ["{\"CONFIRMED\":\"TRUE\"}"]}')

println(object["edgeNodeRegistrationStatus"][0])

Я ожидаю, что код будет напечатан{"CONFIRMED":"TRUE"}.Но это выдает ошибку

Caught: groovy.json.JsonException: expecting a ',' or a ']',  but got 
the current character of  'C' with an int value of 67  on array index of 1 


The current character read is 'C' with an int value of 67
expecting a ',' or a ']',  but got 
the current character of  'C' with an int value of 67  on array index of 1 

line number 1
index number 35
{"edgeNodeRegistrationStatus": ["{"CONFIRMED":"TRUE"}"]}
...................................^
groovy.json.JsonException: expecting a ',' or a ']',  but got 
the current character of  'C' with an int value of 67  on array index of 1 


The current character read is 'C' with an int value of 67
expecting a ',' or a ']',  but got 
the current character of  'C' with an int value of 67  on array index of 1 

line number 1
index number 35
{"edgeNodeRegistrationStatus": ["{"CONFIRMED":"TRUE"}"]}
...................................^
    at jdoodle.run(jdoodle.groovy:4)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Command exited with non-zero status 1

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Использование \" внутри '' -строки даст вам " внутри самой строки (так же, как в "" -строке). Но вы хотите процитировать \" для JSON (не заводной). Поэтому вам нужно использовать \\".

Если вы действительно не хотите иметь эту строку для тестирования, вам лучше просто сгенерировать JSON, который вы ожидаете найти в своем коде. Так что вам не нужно с этим бороться. Э.Г.

JsonOutput.toJson([edgeNodeRegistrationStatus: [JsonOutput.toJson([CONFIRMED: "TRUE"])]])
1 голос
/ 28 мая 2019

Или вы можете использовать другой разделитель строк, например:

def text = $/{"edgeNodeRegistrationStatus": ["{\"CONFIRMED\":\"TRUE\"}"]}/$

def object = jsonSlurper.parseText(text)

println object.edgeNodeRegistrationStatus[0]
...