首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >序列化python for Java中的复数列表

序列化python for Java中的复数列表
EN

Stack Overflow用户
提问于 2018-07-28 00:44:22
回答 1查看 264关注 0票数 0

我有这样一个管道,我在其中流式传输来自Python的数据,并连接到Java应用程序中的流。数据记录是复数矩阵。现在我了解到json.dumps()不能处理python复杂类型。

目前,我已经将复杂的值转换为字符串,将其放入字典中,如下所示:

代码语言:javascript
复制
for entry in range(len(data_array)):
    data_as_string = [str(i) for i in data_array[entry]["DATA"].tolist()]
    send({'data': data_array[entry]["DATA"],
          'coords': data_array[entry]["UVW"].tolist()})

然后把它送到管道。但这需要在Java中进行大量且昂贵的自定义反序列化,这会大大增加管道的运行时间。目前我正在进行反序列化,如下所示:

代码语言:javascript
复制
JSONObject = new JSONOBJECT(string);
try {
            data= jsonObject.getString("data");
            uvw= jsonObject.getString("uvw");
        } catch (JSONException ex) {
            ex.printStackTrace();
        }

然后,我做了大量的data.replace(string1, string2)来删除序列化添加的一些符号,然后循环遍历矩阵,将每个数字转换为Java复杂类型。我的Java反序列化代码如下所示:

代码语言:javascript
复制
        data = data.replace("(","");
        data = data.replace(")","");
        data = data.replace("\"","");
        data = data.replace("],[","¦");
        data = data.replace("[","");
        data = data.replace("]","");

        uvw = uvw.replace("[","");
        uvw = uvw.replace("]","");

        String[] frequencyArrays = data.split("¦");
        Complex[][] tempData = new Complex[48][4];
        for(int i=0;i< frequencyArrays.length;i++){
            String[] complexNumbersOfAFrequency = frequencyArrays[i].split(", ");
            for(int j =0;j<complexNumbersOfAFrequency.length;j++){
                boolean realPartNegative = false;
                Complex c;
                if(complexNumbersOfAFrequency[j].startsWith("-")){
                    realPartNegative = true;
                    //Get ridd of the first - sign to be able to split the real & imaginary parts
                    complexNumbersOfAFrequency[j] =complexNumbersOfAFrequency[j].replaceFirst("-","");
                }
                if(complexNumbersOfAFrequency[j].contains("+")){
                    String[] realAndImaginary = complexNumbersOfAFrequency[j].split("\\+");
                    try {
                        double real = Double.parseDouble(realAndImaginary[0]);
                        double imag = Double.parseDouble(realAndImaginary[1].replace("j",""));
                        if(realPartNegative){
                            c = new Complex(-real,imag);
                        } else {
                            c = new Complex(real,imag);
                        }
                    }catch(IndexOutOfBoundsException e) {
                        //System.out.println("Wrongly formatted number, setting it to 0");
                        c = new Complex(0,0);
                    }
                    catch (NumberFormatException e){
                        System.out.println("Wrongly formatted number, setting it to 0");
                        c = new Complex(0,0);
                    }

                } else {
                    String[] realAndImaginary = complexNumbersOfAFrequency[j].split("-");
                    try {
                        double real = Double.parseDouble(realAndImaginary[0]);
                        double imag = Double.parseDouble(realAndImaginary[1].replace("j", "").replace("e", ""));
                        if (realPartNegative) {
                            c = new Complex(-real, -imag);
                        } else {
                            c = new Complex(real, -imag);
                        }
                    }
                        catch(IndexOutOfBoundsException e){
                            System.out.println("Not correctly formatted: ");
                            for(int temp = 0;temp<realAndImaginary.length;temp++){
                                System.out.println(realAndImaginary[temp]);
                            }
                            System.out.println("Setting it to (0,0)");
                            c = new Complex(0,0);
                        }
                        catch (NumberFormatException e){
                            c = new Complex(0,0);
                        }
                    }

                tempData[i][j] = c;
            }

        }

现在我的问题是,有没有办法

1)在Java中反序列化Dictionary,而不需要昂贵的字符串操作和遍历每条记录的矩阵,或者

2)更好地在python中序列化数据,以便在java中可以更好地序列化数据

任何提示都是值得感谢的。

编辑: JSON如下所示

代码语言:javascript
复制
{"data": ["[(1 + 2j), (3 + 4j), ...]","[(5 + 6j), ...]", ..."],

"coords": [1,2,3]}

编辑:对于坐标,我可以很容易地在Java中进行反序列化:

代码语言:javascript
复制
uvw = uvw.replace("[","");
uvw = uvw.replace("]","");
String[] coords = uvw.split(",");

然后使用Double.parseDouble()coords中转换字符串,但是对于数据字符串,这要复杂得多,因为字符串中充满了需要删除的字符,以便获得实际数字并将它们放在我想要转换成的Complex[][]中的正确位置

EN

回答 1

Stack Overflow用户

发布于 2018-07-28 01:08:03

如果我没理解错的话,你的矩阵应该由复数组组成,而复数组又包含一个实数和一个虚数。

如果是这样,您的数据可能如下所示:

代码语言:javascript
复制
[[{'r':1,'j':2},{'r':3,'j':4}, ...],[{'r':5,'j':6}, ...]]

这意味着您有一个JSON数组,其中包含包含对象的数组。这些对象有两个属性:r定义实数的值,j定义虚数的值。

在Java语言中解析应该是直接的,也就是说,使用像Jackson或Gson这样的映射器,你只需要将它解析成类似ComplexNumber[][]的东西,而ComplexNumber可能看起来像这样(简化):

代码语言:javascript
复制
public class ComplexNumber {
  public double r;
  public double j;
}

当然,可能已经存在用于复数的类,因此您可能想要使用这些类。此外,您可能需要手动对其进行反序列化(因为目标类不能简化映射器,或者您不能/不想使用映射器),但在这种情况下,只需迭代JSONArray元素并从JSONObject中提取rj即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51562279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档