【问题标题】:Get a stream of decimal numbers from long json string in Java [duplicate]从Java中的长json字符串中获取十进制数字流[重复]
【发布时间】:2020-06-14 01:04:50
【问题描述】:

注意: 问题是从 json 字符串创建数字流,最好使用正则表达式。请不要将该问题视为与正则表达式中其他内容的重复。我的主要目标是读取一串数字。为此目的使用正则表达式是可选的。

我的目标是创建一个从大型 json 字符串中读取的十进制数字数组,如下所示。

输入示例:

 {
    "item1": 102.119,
    "item2": "unknown",
    "item3": 200.12,
    "item4": 1.08,
    "item5": 0.04
 }

预期输出:

我的数据 = [102.119, 200.12, 1.08, 0.04]

我尝试了什么:

import java.util.ArrayList;

public class MyData { 
    public static void main(String[] args) {
        String input =  ("{\"item1\": 102.119," 
                          + "\"item2\": \"unknown\"," 
                          + "\"item3\": 200.12,"
                          + "\"item4\": 1.08,"
                          + "\"item5\": 0.04}"
                        );
        ArrayList<Double> output = new ArrayList<>();
        for(String s1 : input.split(",")) {
            for(String s2: s1.split(":")) {
                try {
                    output.add(Double.parseDouble(s2));
                } catch(Exception e) {
                    System.out.println(e.toString() + " : " + s2 + " is not a number!");
                }               
            }
        }
        System.out.println("\nMy Data = " + output.toString());
    }
}

实际输出:

$ javac MyData.java 

$ java MyData
java.lang.NumberFormatException: For input string: "{"item1"" : {"item1" is not a number!
java.lang.NumberFormatException: For input string: ""item2"" : "item2" is not a number!
java.lang.NumberFormatException: For input string: ""unknown"" :  "unknown" is not a number!
java.lang.NumberFormatException: For input string: ""item3"" : "item3" is not a number!
java.lang.NumberFormatException: For input string: ""item4"" : "item4" is not a number!
java.lang.NumberFormatException: For input string: ""item5"" : "item5" is not a number!
java.lang.NumberFormatException: For input string: "0.04}" :  0.04} is not a number!

My Data = [102.119, 200.12, 1.08]

问题:

  1. 最终数字 0.04 未读入数据数组。
  2. 两个 for 循环在大型输入集上执行需要很长时间。

需要帮助:

您能否帮助改进代码以更有效地读取所有十进制数字?

能否告诉我正则表达式模式匹配是否可以用于这种情况?

【问题讨论】:

  • 我不明白为什么这个问题被认为是正则表达式的重复。我想从json中读取数字作为流,最好只使用正则表达式。由于此问题已作为副本关闭,我现在无法找到答案。有人可以帮助重新打开问题,以便我得到答案吗?

标签: java arrays json stream double


【解决方案1】:

试试这个正则表达式:

/: (\d+(?:\.\d+))/

【讨论】:

  • 您好,Illya,谢谢。我使用regexpal.com 网站尝试了给定的正则表达式 - /: (\d+(?\.\d+))/,但正则表达式与十进制数字不匹配。 ([\d]+).([\d]+) 的正则表达式模式与数字匹配。我会试试这个。
  • 啊,对不起,我忘记了:,这个: (\d+(?:\.\d+))/ 将匹配十进制数
【解决方案2】:

使用字符串拆分和正则表达式都有一些令人讨厌的边缘情况。如果您无法完全控制 JSON,我不建议您尝试。

最好使用 org.json 或 GS​​ON 等现有库来解析 JSON。 两者都提供了一个对象结构,您可以像当前解决方案一样循环和提取它。

https://devqa.io/how-to-parse-json-in-java/

【讨论】:

【解决方案3】:

也许这对你有帮助?

/: (\d+\.\d+)/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2021-12-01
    • 2019-11-01
    • 2012-03-22
    相关资源
    最近更新 更多