Ошибка синтаксического анализа JSON с использованием gson - PullRequest
0 голосов
/ 29 марта 2012


Я пытаюсь проанализировать данные в классе.
Но проблема в том, что одно из значений представлено в формате Json.
Следовательно, я получаю MalformedJsonException.
Это строка Json:

{
    "name": "Check on Server Health ",
    "state": "ABORTED",
    "startTime": 1332962596131,
    "triggeredBy": "GUI_MANUAL",
    "completionPct": 25,
    "currentStep": "sayHello",
    "processDefId": "SW21SW",
    "jobRetries": 0,
    "businessKey": -1,
    "comments": "couldn't instantiate class com.mikewidgets.helloWorld.HelloWorldTask",
    "endTime": null,
    "status": "DELAY , ERR",
    "mtId": "MOTOROLA",
    "instParms": "{"message":"start-workflow","sender":"CLI_APP","receiver":"BPM_ENG","parameters":{"workflowId":"SW21SW","mikesname":"Mikeeeeeeey","wf_HostName":"localhost","triggeredBy":"GUI_MANUAL","replyQueue":"temp-queue: //ID: SW-Demo01-51605-1332362748085-0: 2246: 1"},"userId":"Ab","mtId":"MOTOROLA","messageType":"MESSAGE_MSG"}",
    "execId": "292",
    "startUserId": "Ab"
  }


Это класс бина, который я использую:

import com.google.gson.JsonElement;

public class WfActive {

private String name;
private String state;
private String startTime;
private String status;
private String endTime;
private String comments;
private String triggeredBy;
private String execId;
private JsonElement instParms;
private String startUserId;
private String mtId;
private String businessKey;
private String completionPct;
private String jobRetries;
private String processDefId;
private String currentStep;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getState() {
    return state;
}
public void setState(String state) {
    this.state = state;
}
public String getStartTime() {
    return startTime;
}
public void setStartTime(String startTime) {
    this.startTime = startTime;
}
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}
public String getEndTime() {
    return endTime;
}
public void setEndTime(String endTime) {
    this.endTime = endTime;
}
public String getComments() {
    return comments;
}
public void setComments(String comments) {
    this.comments = comments;
}
public String getTriggeredBy() {
    return triggeredBy;
}
public void setTriggeredBy(String triggeredBy) {
    this.triggeredBy = triggeredBy;
}
public String getExecId() {
    return execId;
}
public void setExecId(String execId) {
    this.execId = execId;
}
public JsonElement getInstParms() {
    return instParms;
}
public void setInstParms(JsonElement instParms) {
    this.instParms = instParms;
}
public String getStartUserId() {
    return startUserId;
}
public void setStartUserId(String startUserId) {
    this.startUserId = startUserId;
}
public String getMtId() {
    return mtId;
}
public void setMtId(String mtId) {
    this.mtId = mtId;
}
public String getBusinessKey() {
    return businessKey;
}
public void setBusinessKey(String businessKey) {
    this.businessKey = businessKey;
}
public String getCompletionPct() {
    return completionPct;
}
public void setCompletionPct(String completionPct) {
    this.completionPct = completionPct;
}
public String getJobRetries() {
    return jobRetries;
}
public void setJobRetries(String jobRetries) {
    this.jobRetries = jobRetries;
}
public String getProcessDefId() {
    return processDefId;
}
public void setProcessDefId(String processDefId) {
    this.processDefId = processDefId;
}
public String getCurrentStep() {
    return currentStep;
}
public void setCurrentStep(String currentStep) {
    this.currentStep = currentStep;
}

}
Но я получаю искаженное исключениеat:

LA","instParms":"{"message":"start-workf // this is inside instParms

В чем моя ошибка и как ее исправить?
Пожалуйста, простите большой код, интересная часть - "instParms"

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Ваши данные JSON искажены (средняя строка ниже):

"mtId": "MOTOROLA",
"instParms": "{"message":"start-workflow","sender":"CLI_APP","receiver":"BPM_ENG","parameters":{"workflowId":"SW21SW","mikesname":"Mikeeeeeeey","wf_HostName":"localhost","triggeredBy":"GUI_MANUAL","replyQueue":"temp-queue: //ID: SW-Demo01-51605-1332362748085-0: 2246: 1"},"userId":"Ab","mtId":"MOTOROLA","messageType":"MESSAGE_MSG"}",
"execId": "292",

Вторая двойная кавычка в значении instParms должна быть экранирована. В качестве альтернативы можно использовать одинарные кавычки, если вы знаете, что одинарные кавычки не используются в значении.

Это действительно:

"mtId": "MOTOROLA",
"instParms": '{"message":"start-workflow","sender":"CLI_APP","receiver":"BPM_ENG","parameters":{"workflowId":"SW21SW","mikesname":"Mikeeeeeeey","wf_HostName":"localhost","triggeredBy":"GUI_MANUAL","replyQueue":"temp-queue: //ID: SW-Demo01-51605-1332362748085-0: 2246: 1"},"userId":"Ab","mtId":"MOTOROLA","messageType":"MESSAGE_MSG"}',
"execId": "292",

и вот так:

"mtId": "MOTOROLA",
"instParms": "{\"message\":\"start-workflow\",\"sender\":\"CLI_APP\",\"receiver\":\"BPM_ENG\",\"parameters\":{\"workflowId\":\"SW21SW\",\"mikesname\":\"Mikeeeeeeey\",\"wf_HostName\":\"localhost\",\"triggeredBy\":\"GUI_MANUAL\",\"replyQueue\":\"temp-queue: //ID: SW-Demo01-51605-1332362748085-0: 2246: 1\"},\"userId\":\"Ab\",\"mtId\":\"MOTOROLA\",\"messageType\":\"MESSAGE_MSG\"}",
"execId": "292",

Другой альтернативой может быть добавление значения instParms в качестве подобъекта, а не перемешивания:

"mtId": "MOTOROLA",
"instParms": {
    "message": "start-workflow",
    "sender": "CLI_APP",
    "receiver": "BPM_ENG",
    "parameters": {
        "workflowId": "SW21SW",
        "mikesname": "Mikeeeeeeey",
        "wf_HostName":"localhost",
        "triggeredBy":"GUI_MANUAL",
        "replyQueue":"temp-queue: //ID: SW-Demo01-51605-1332362748085-0: 2246: 1"
    },
    "userId": "Ab",
    "mtId": "MOTOROLA",
    "messageType": "MESSAGE_MSG"
},
"execId": "292",

Возможно, это лучшее решение (если нет других веских причин для сохранения строкового представления).

1 голос
/ 29 марта 2012

Вы не можете легко исправить это в коде , потребляющем JSON, и вы не должны. Вам нужно исправить другой конец, который генерирует неверный JSON. Это выглядит как ошибочная кавычка до { в значении instParms и после } в конце. Это или все значение instParms действительно должно быть строкой, и строка не была должным образом экранирована (кавычки, начинающиеся с обратной косой черты и т. Д.).

...