回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个管道,从Python流式传输数据,并连接到Java应用程序中的流。数据记录是复数矩阵。现在我明白了json.dumps文件()无法处理pythons复杂类型。你知道吗</p>
<p>目前,我已经将复杂值转换为字符串,请将其放入字典中,如下所示:</p>
<pre><code>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()})
</code></pre>
<p>把它送到管道里。但这需要在Java中进行大量且昂贵的自定义反序列化,这会大大增加管道的运行时间。
目前我正在进行反序列化,如下所示:</p>
<pre><code>JSONObject = new JSONOBJECT(string);
try {
data= jsonObject.getString("data");
uvw= jsonObject.getString("uvw");
} catch (JSONException ex) {
ex.printStackTrace();
}
</code></pre>
<p>然后我做了很多<code>data.replace(string1, string2)</code>来删除序列化添加的一些符号,然后循环遍历矩阵,将每个数字转换成Java复杂类型。
我的Java反序列化代码如下所示:</p>
<pre><code> 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;
}
}
</code></pre>
<p>现在我的问题是,是否有办法</p>
<p>1)在Java中反序列化字典,而无需昂贵的字符串操作和循环遍历每个记录或数据的矩阵</p>
<p>2)在python中更好地序列化数据,以便在java中做得更好</p>
<p>如有任何提示,我们将不胜感激。你知道吗</p>
<p>编辑:JSON如下所示</p>
<pre><code>{"data": ["[(1 + 2j), (3 + 4j), ...]","[(5 + 6j), ...]", ..."],
"coords": [1,2,3]}
</code></pre>
<p>编辑:对于坐标,我可以很容易地用Java进行反序列化:</p>
<pre><code>uvw = uvw.replace("[","");
uvw = uvw.replace("]","");
String[] coords = uvw.split(",");
</code></pre>
<p>然后用<code>Double.parseDouble()</code>在<code>coords</code>中转换字符串,但是对于数据字符串来说,这要复杂得多,因为字符串中充满了需要删除的字符,以便获得实际的数字并将它们放在我要转换的<code>Complex[][]</code>中的正确位置</p>