【问题标题】:JSON Array exception using json string field使用 json 字符串字段的 JSON 数组异常
【发布时间】:2017-07-12 02:30:17
【问题描述】:

我正在尝试创建一个 JSONArray 对象,并且在 JSONArray 中有另一个数组,其中包含一个对象,该对象是一个 json 字符串,如下所示。注意 res 字段。

[{
    "time": 123813213,
    "value": [{
        "name": "task",
        "res": "{\"taskName\" : \"NAME\", \"taskValue\" : 3}"
    }]
}]

当我将上述内容作为字符串返回并执行时,这会导致异常

String jsonStr = "[{ \"time\": 123813213, \"value\": [{ \"name\": \"task\", \"res\": \"{\"taskName\", \"taskValue\"}\" }] }]";

JSONArray jsonArr = new JSONArray(jsonStr);

当我通过在我存储的 json 字符串所在的位置添加额外的 \ 来解决此问题时。

String jsonStr = "[{ \"time\": 123813213, \"value\": [{ \"name\": \"task\", \"res\": \"{\\\"taskName\\\", \\\"taskValue\"}\\\" }] }]";

JSONArray jsonArr = new JSONArray(jsonStr);

请注意我添加的附加 \。我不确定如何解决第一种情况,因为我不是自己创建 jsonStr,而是从某个地方获取它,它只包含一个 \ 而不是三个 \。在第一种情况下我做错了什么吗?

我得到的例外是使用第一个示例

org.json.JSONException: Expected a ',' or '}' at 61 [character 62 line 1]
    at org.json.JSONTokener.syntaxError(JSONTokener.java:432)
    at org.json.JSONObject.<init>(JSONObject.java:223)
    at org.json.JSONTokener.nextValue(JSONTokener.java:362)
    at org.json.JSONArray.<init>(JSONArray.java:117)
    at org.json.JSONTokener.nextValue(JSONTokener.java:365)
    at org.json.JSONObject.<init>(JSONObject.java:208)
    at org.json.JSONTokener.nextValue(JSONTokener.java:362)
    at org.json.JSONArray.<init>(JSONArray.java:117)
    at org.json.JSONArray.<init>(JSONArray.java:145)
    at Main.main(Main.java:10)

第二个例子解析得很好,返回正确的结果就是这个。

[{"time":123813213,"value":[{"res":"{\"taskName\", \"taskValue\"}","name":"task"}]}]

问题是如何让第一个示例返回这个?

【问题讨论】:

    标签: javascript java arrays json


    【解决方案1】:

    第一种情况应该没问题。由于您是从外部来源获取的,因此您不必添加额外的反斜杠来转义字符。但是当您手动在代码中输入字符串文字时,需要添加反斜杠来转义某些字符。

    请注意,"{\"taskName\", \"taskValue\"}" 是无效的 JSON。如果可以对其进行解析,则会导致 {"taskName", "taskValue"} 在 javascript 中不是有效的语法。要创建一个数组,您可以使用["taskName", "taskValue"]

    如果你打算让它成为一个对象,它会像{"taskName": "Wash dishes", "taskValue": 5}

    【讨论】:

    • 对不起,我没有放整个 json,我修复了它以使其有效。问题是第一个不起作用。它返回一个异常。 "res": "{\"taskName\" : \"NAME\", \"taskValue\" : 3}" 我认为原因是将 taskName 和 taskValue 视为 json 对象,但它们不是。我想将 res 的整个值保留为字符串。我该如何解决?
    • 啊,我一开始没有注意到,但这是因为JSONArray 只接受 JSON 数组,但你传递给它的是一个 JSON 对象。
    • 为什么第二种情况有效呢?我正在尝试将 json 对象作为字符串而不是 json 对象(指 res 字段)传递。
    • 我的错误。我只是在想res 不是 JSON 数组时我写的,我误解了你的问题。再看看。
    • 嗯。第一个例子对我来说解析得很好。它如何从那里到达第二个示例中写出的jsonStr 字符串?
    【解决方案2】:

    请分享例外情况。这是一个有效的 JSON,它应该可以工作。

    第二个有效,因为当您在 JAVA 中将 JSON 转换为字符串时,它会被创建为 this。

    "[{\"time\":123813213,\"value\":[{\"name\":\"task\",\"res\":\"{\\"taskName\\" : \\"NAME\\", \\"taskValue\\" : 3}\"}]}]"

    您可以通过在 java 中使用任何 JSON 到字符串转换器来尝试此操作。 你的 json 没有问题。

    【讨论】:

    • org.json.JSONException:在 org.json 的 org.json.JSONTokener.syntaxError(JSONTokener.java:432) 处的 61 [字符 62 第 1 行] 处应有一个“,”或“}” .JSONObject.(JSONObject.java:223) 在 org.json.JSONTokener.nextValue(JSONTokener.java:362) 在 org.json.JSONArray.(JSONArray.java:117) 在 org.json。 JSONTokener.nextValue(JSONTokener.java:365) 在 org.json.JSONObject.(JSONObject.java:208) 在 org.json.JSONTokener.nextValue(JSONTokener.java:362) 在 org.json.JSONArray。(JSONArray.java:117) 在 org.json.JSONArray.(JSONArray.java:145) 在 Main.main(Main.java:10)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多