【问题标题】:Remove all the Quotes from JSONArray从 JSONArray 中删除所有引号
【发布时间】:2018-02-21 03:19:16
【问题描述】:
JSONArray error = data.getJSONArray("error");

                for (int it=0; it<error.length(); it++){
             error.toString().replaceAll("\"", " ");
                    System.out.println(error);
                }           

我从 SOLR 链接收到 JSON 响应,该链接已被解析为 JSONArray。在代码中,我试图从 JSONArray 中删除双引号。但它没有发生。任何人都可以尽快帮助我吗?提前致谢。

【问题讨论】:

  • 请提供您的 JSON 样本。你认为toString().replaceAll(...) 做了什么?你为什么这么认为?
  • “没有发生”不是很具体,怎么了?此外,您正在遍历数组,甚至从未引用索引
  • 在给定特定输入的情况下,您能否修改您的问题以解释预期的输出?

标签: java arrays json solr


【解决方案1】:

我知道出了什么问题。您没有打印来自replaceAll 调用的结果。要从 json 数组输出中删除所有引号,试试这个。

JSONArray error = data.getJSONArray("error");
System.out.println(error.toString().replaceAll("\"", " "));

请注意,这也会删除数组值中的任何引号,这可能不是您想要的。例如,["cool says \"meow\"","stuff"] 的输出将是 [ cool says \ meow\ , stuff ]。如果您只想要字符串值,我建议您查看 org.json.JSONArray 文档中的 JSONArray::get(int)JSONArray::length()

【讨论】:

  • 非常感谢。你能告诉我如何从数组中删除反斜杠和双引号吗?我想删除这个 \" 这两个字符,所有空格前导和尾随。我在上面的代码中给出了一个双斜杠,但它不起作用。它显示编译器错误。
  • 使用四个反斜杠字符调用replaceAllreplaceAll("\\\\", " ")。你确定这是你想要的吗?我从来没有发布过像这样修改 json 字符串的代码,因为我通常希望保留存储在数组项中的值。如果json对象是["cool says \"meow\""],期望值不应该是cool says "meow"吗?
  • 是的,在这种情况下,我应该用双引号替换 \" 这对吗?
  • 不仅如此,您还必须替换 json 规范 json.org 中概述的所有 unicode 字符。实现起来要复杂得多,并且需要大量代码。假设您想以原始形式打印值,请参阅我的其他解决方案。
【解决方案2】:

看起来您正在尝试打印一个 json 字符串数组。如果您替换所有引号,它还将替换字符串内的引号并扭曲编码的值。如果有人这样对我,我不会很高兴:)。例如看看这个 json。

[
  "hello",
  "cat says \"meow\"",
  "dog says \"bark\"",
  "the temperature is 15\u00B0"
]

不仅引号会丢失,而且度数的特殊 unicode 字符也可能看起来不正确 (15°)。要以原始形式返回值,您需要实现整个 json spec!那是很多工作,可能不是你想做的事情。我以前做过,但并不容易。

幸运的是,我们已经在使用一个库来为我们完成所有这些工作:) 只需使用 org.json 包。它拥有正确编码和解码值所需的一切。你不认为你必须自己做所有的解析是吗?要以原始形式打印字符串,您可以这样做。

/** use these imports
 *
 * import org.json.JSONArray;
 * import org.json.JSONObject;
 * import org.json.JSONException;
 **/
JSONArray ja = new JSONArray();

// add some strings to array
ja.put("hello");
ja.put("cat says \"meow\"");
ja.put("the temperature is 15\u00B0");

// add an int
ja.put(1);

// add an object
JSONObject jo = new JSONObject();
jo.put("cool", "cool");
ja.put(jo);

// loop and print only strings
for (int i = 0; i < ja.length(); ++i) {
    try {
        // ignore null values
        if (!ja.isNull(i)) {
            System.out.println(ja.getString(i));
        }
    } catch (JSONException e) {
        // not a string
        // try ja.getBoolean
        // try ja.getDouble
        // try ja.getInt
        // try ja.getJSONArray
        // try ja.getJSONObject
        // try ja.getLong
    }
}

要使用您的原始代码,只需将ja 替换为您自己的变量。请注意,在 catch 子句中,我放置了一些 cmets,显示了您可以用来读取已解析 json 对象中的值的其他方法。

【讨论】:

  • 有人可以帮我编辑这个问题吗?我已被阻止发布新问题,我有一些疑问需要专家澄清
  • @user3222718,我只有几个建议恶作剧地笑了。解决问题总是从确定导致问题的原因开始。您对问题的描述和标题过于宽泛。给出预期输出的例子。 搜索和研究 - 需要工作。在 Stack Overflow 的 /help 部分有一个标准列表,定义了如何提出一个好的问题。 假装你正在和一位忙碌的同事交谈:实际上可以多说几句。 拼写、语法和标点符号:需要工作。 在代码之前引入问题:需要工作。
猜你喜欢
  • 2014-03-19
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多