Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中的长json字符串中获取十进制数流_Java_Arrays_Json_Stream_Double - Fatal编程技术网

从Java中的长json字符串中获取十进制数流

从Java中的长json字符串中获取十进制数流,java,arrays,json,stream,double,Java,Arrays,Json,Stream,Double,注意:问题是从json字符串创建数字流,最好使用正则表达式。请不要把这个问题看成是正则表达式的另一个复制品。我的主要目标是阅读一连串的数字。为此目的使用正则表达式是可选的 我的目标是创建一个从一个大json字符串读取的十进制数数组,如下图所示 输入示例: { "item1": 102.119, "item2": "unknown", "item3": 200.12, "item4": 1.08, "item5": 0.04 } import java

注意:问题是从json字符串创建数字流,最好使用正则表达式。请不要把这个问题看成是正则表达式的另一个复制品。我的主要目标是阅读一连串的数字。为此目的使用正则表达式是可选的

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

输入示例:

 {
    "item1": 102.119,
    "item2": "unknown",
    "item3": 200.12,
    "item4": 1.08,
    "item5": 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]
预期输出:

 {
    "item1": 102.119,
    "item2": "unknown",
    "item3": 200.12,
    "item4": 1.08,
    "item5": 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]
我的数据=[102.119200.12,1.08,0.04]

我的尝试:

 {
    "item1": 102.119,
    "item2": "unknown",
    "item3": 200.12,
    "item4": 1.08,
    "item5": 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]
问题:

 {
    "item1": 102.119,
    "item2": "unknown",
    "item3": 200.12,
    "item4": 1.08,
    "item5": 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]
  • 最后的数字0.04不会读取到数据数组中
  • 在大型输入集上执行for的两个循环需要很长时间
  • 需要帮助:

     {
        "item1": 102.119,
        "item2": "unknown",
        "item3": 200.12,
        "item4": 1.08,
        "item5": 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]
    
    您能否帮助改进代码,以更有效的方式读取所有十进制数


    您能告诉我正则表达式模式匹配是否可用于此场景吗?

    尝试使用此正则表达式:

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

    对于字符串拆分和正则表达式,都存在一些令人讨厌的边缘情况。如果您不能完全控制JSON,我不建议您尝试这样做

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


    也许这对你有帮助

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

    嗨,伊利亚,谢谢你。我使用网站尝试了给定的正则表达式-/:(\d+(?\。\d+))/,但正则表达式与十进制数不匹配。([\d]+)([\d]+)的正则表达式模式已与数字匹配。我会试试这个。啊,对不起,我忘了
    ,这个
    :(\d+(?:\。\d+)/
    将匹配十进制数字。我是罗兰,谢谢你分享解析json的链接。我会试试的。别忘了还有一个关于Java的,在上可用的。我不明白为什么这个问题被认为是regexp的重复。我想从json中将数字作为流读取,最好使用regexp。我现在找不到答案,因为这个问题作为一个重复问题关闭。有人能帮我重新打开这个问题,这样我就能得到答案吗?