java - 如何完全替换一个数字而不中间修改?

标签 java string replaceall

我有 oldIdnewId,我想用 newId 替换 oldId

public static void main(String[] args) {
    String jsonString = "{\"user_id\":{\"long\":876},\"client_id\":{\"int\":0},\"affinity\":[{\"try\":{\"long\":55787693},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}";

    // some other json strings -

    // String jsonString = "{\"user_id\":{\"string\": \"876\"},\"client_id\":{\"int\":0},\"affinity\":[{\"try\":{\"long\":55787693},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}";
    // String jsonString = "{\"user_id\": \"876\", \"client_id\":{\"int\":0},\"affinity\":[{\"try\":{\"long\":55787693},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}";
    // String jsonString = "{\"user_id\": 876, \"client_id\":{\"int\":0},\"affinity\":[{\"try\":{\"long\":55787693},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}";
    // String jsonString = "{\"user_id\": null, \"client_id\":{\"int\":0},\"affinity\":[{\"try\":{\"long\":55787693},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}";

    String newResponse = changeJsonString(jsonString, "876", "54321");
    System.out.println(newResponse);
}

private static String changeJsonString(String originalResponse, String oldId, String newId) {     
    return originalResponse.replaceAll(String.valueOf(oldId), String.valueOf(newId));
}

使用上面的代码,它会将 newResponse 打印为 -

{\"user_id\":{\"long\":54321},\"client_id\":{\"int\":0},\"affinity\":[{\"matter\":{\"long\":5575432193},\"scoring\":{\"float\":0.19}},{\"try\":{\"long\":1763},\"scoring\":{\"float\":0.0114}}]}    

如果你仔细观察,有两个字段发生了变化,一个是 user_id,第二个是 matter,因为 replaceAll 会将所有内容替换为新字段。

  • user_id 876 更改为 54321
  • 问题 55787693 已更改为 5575432193

我正在寻找的是 - 它应该只将完整的数字替换为新的数字,而不是将中间的任何数字修改为新的数字。例如 - user_id 876 是一个完整的数字,因此它应该仅将 876 替换为 54321 而不是事情其中876在中间。

一般来说,我想将一个号码完全替换为一个新号码。我不想在中间替换一些东西。有什么办法可以做到这一点吗?

最佳答案

正确的方法是将 JSON 数据作为 JSON 数据进行处理。

您使用的任何字符串替换或正则表达式都是脆弱的,并且可能会破坏某些输入 JSON 字符串的代码。例如,如果 user_idmatter 值相同怎么办?那么你不中间替换的假设就失败了。

处理 JSON 只需三行代码:

private static String changeJsonString(String originalResponse, String newId) {     
    try {
        JSONObject root = new JSONObject(originalResponse);
        ((JSONObject) root.get("user_id")).put("long", Long.parseLong(newId));
        return root.toString();
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }
}

我假设您不需要 oldId 。如果您的输入字符串可能包含多个 user_id,您只需扩展我的示例即可检查并替换适当的 JSONObject

请注意,我正在使用 org.json.jar for Java来自www.json.org 。您可以随意使用任何您喜欢的 JSON 解析器。

<小时/> 因为,您重新发布了这个问题,但在那里提供了完整的 JSON 字符串格式,所以我提出了这个解决方案 again但更新后可以处理 user_id 的所有可能的 JSON 数据类型。

关于java - 如何完全替换一个数字而不中间修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27914305/

相关文章:

java - 关于jsf bean注入(inject)spring bean的一个问题

java - 为什么11的皮萨诺周期等于120而不是9

Java 相当于 PHP 的 call_user_func()

c# - 用于选择包含所有字母的字符串的 Linq 语句

android - 如何在android中将字符 `\n`替换为新行

java - 将参数中的空格替换为运行命令

java - 将所需的jar添加到Eclipse下的Application中

java - 如何在避免 NoSuchElementException 错误的同时获取可选值?

java - 正则表达式替换括号()之间的内容

java - 对字符串数组进行打乱,以便字符串必须完全打乱,而不是在 Java 中的原始索引中