Java 使用gson时出现JSON解析错误

Java 使用gson时出现JSON解析错误,java,android,json,parsing,gson,Java,Android,Json,Parsing,Gson,我正在尝试将数据解析为类。 但问题是其中一个值是Json格式的。 因此,我得到了一个格式错误的异常。 这是Json字符串: { "name": "Check on Server Health ", "state": "ABORTED", "startTime": 1332962596131, "triggeredBy": "GUI_MANUAL", "completionPct": 25, "currentStep": "sayHello",


我正在尝试将数据解析为类。
但问题是其中一个值是Json格式的。
因此,我得到了一个格式错误的异常。
这是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"
  }

这是我正在使用的bean类:

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;
}
}
但我在以下位置收到一个格式错误的异常:

LA","instParms":"{"message":"start-workf // this is inside instParms
我的错误是什么?如何纠正?

请原谅这个大代码,有趣的部分是“instParms”

您的JSON数据格式不正确(下面中间行):

应转义
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
的值作为子对象而不是stirng嵌入:

"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",

这可以说是最好的解决方案(除非有其他令人信服的理由保留字符串表示)。

您的JSON数据格式不正确(下面中间行):

应转义
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
的值作为子对象而不是stirng嵌入:

"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",

这可以说是最好的解决方案(除非有其他令人信服的理由保留字符串表示)。

您不能在使用JSON的代码中轻松修复它,也不应该。您需要修复另一端,它正在生成无效的JSON。它看起来就像是在
instParms
的值上的
{
之前和结尾处的
}
之后的错误引用。这或整个
instParms
值实际上是一个字符串,并且该字符串没有被正确转义(前面有反斜杠的引号,等等)。

您不能在使用JSON的代码中轻松修复它,您也不应该这样做。您需要修复另一端,它正在生成无效的JSON。它看起来就像是在
instParms
的值上的
{
之前和结尾处的
}
之后的错误引用。这或整个
instParms
值实际上是一个字符串,并且该字符串没有正确转义(引号前面有反斜杠等)。

Hi。instParms的值是一个json字符串。这就是为什么我试图用JsonElement来表示它。它是一个包含json的字符串。例如,您可以在instParams.Hi中转义所有双引号。instParms的值是一个json字符串。这就是为什么我试图用JsonElement来表示它。它是一个包含json的字符串。例如,您可以在instParams.ok中转义所有双引号。我抓到你了。谢谢但是,如果“另一端”修复需要更长的时间,我该如何着手修复它呢?我相信你能理解在一个巨大的工作场所工作。@Brahadeesh:你可以尝试做一些字符串操作来逃避引号中的位,但坦率地说,这会很脆弱。这个错误显示了另一端的一个相当大的问题,我会集中精力解决这个问题,即使这需要时间。好的。我抓到你了。谢谢但是,如果“另一端”修复需要更长的时间,我该如何着手修复它呢?我相信你能理解在一个巨大的工作场所工作。@Brahadeesh:你可以尝试做一些字符串操作来逃避引号中的位,但坦率地说,这会很脆弱。这个错误显示了另一端的一个相当大的问题,我将集中精力解决这个问题,即使这需要时间。