【问题标题】:JSON parse error using gson使用 gson 的 JSON 解析错误
【发布时间】:2012-03-28 20:26:47
【问题描述】:


我正在尝试将数据解析为一个类。
但问题是其中一个值是 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"
  }


这是我正在使用的 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”

【问题讨论】:

    标签: java android json parsing gson


    【解决方案1】:

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

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

    【讨论】:

    • 嗨。 instParms 的值是一个 json 字符串。这就是为什么我尝试使用 JsonElement 来表示它。它是一个带有 json 的字符串。
    • 你可以例如转义 instParams 中的所有双引号。
    【解决方案2】:

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

    【讨论】:

    • 好的。我接到你了。谢谢。但是,如果“另一端”修复需要更长的时间,我将如何着手修复它?我敢肯定,你可以理解在一个巨大的工作场所工作。
    • @Brahadeesh:您可以尝试进行一些字符串操作来转义引号中的位,但坦率地说,它会很脆弱。该错误表明另一端存在相当大的问题,即使需要时间,我也会专注于修复它。
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多