0

我有一个像这样的复杂 JSON 字符串。

  "rectangle": 
    "{\n  \
    "minX\": 0.0,\n  \
    "minY\": 0.0,\n  \
    "maxX\": 2460.0,\n  \
    "maxY\": 3008.0\n}",
  "graphSpace": 
    "[
       [{\
        "rectangle\":
            \"{\\n  \\\
            "minX\\\": 0.0,\\n  \\\
            "minY\\\": 0.0,\\n  \\\
            "maxX\\\": 0.0,\\n  \\\
            "maxY\\\": 0.0\\n}\",\

这并不完整。但是如何阅读这个?

4

1 回答 1

0

您的“json 字符串”不是字符串。它是 json 数据(如 json 文件中所示)。

此 json 数据的所有值都是“字符串化 json”。json 数据的第二部分,undergraphSpace是双字符串化的。首先让我们了解您拥有什么,然后我们会将其读入 Java。

格式化后,我们拥有的内容更加清晰:

"rectangle": 
    "{\n  
      \"minX\": 0.0,\n  
      \"minY\": 0.0,\n  
      \"maxX\": 2460.0,\n  
      \"maxY\": 3008.0\n}",
"graphSpace": 
  "[[{
     \"rectangle\":
        \"{\\n  
        \\\"minX\\\": 0.0,\\n  
        \\\"minY\\\": 0.0,\\n  
        \\\"maxX\\\": 0.0,\\n  
        \\\"maxY\\\": 0.0\\n}\",
 \ 

最后一个逗号和反斜杠是您未显示的一些连续 JSON 的一部分。graphSpace 的 json 字符串值在您的示例中不完整,并且没有右双引号。(最后一行代码中的 \" 只是字符串的一部分,并用反斜杠“转义”。

\\ 是在字符串中写入单个反斜杠的方法。"\" 是在字符串中写入双引号的方法。

string s1 = "the following double quote \" is not the end of the string.";
string s2 = "while the double quote after the next period does close the string."; 

所以rectangle保存了一个json字符串,它本身可以解析成一个js对象。

也包含一个 json 字符串,但是这个 json 字符串在解析为 js 对象时将graphSpace包含一个对象数组rectangle(其中包含一个矩形对象),并且这个矩形对象 AFTER PARSED 包含一个 json 字符串。

我再说一遍。解析完graphSpacejson 后,该rectangle对象将保存一个 json 字符串,没有多余的双引号,因此您将拥有一个带有以下内容的 javascript 对象

myobj.graphSpace = 
  [[{
     rectangle:
        "{\n  
          \"minX\": 0.0,\n  
          \"minY\": 0.0,\n  
          \"maxX\": 0.0,\n  
          \"maxY\": 0.0\n}\"
// and I presume the rest of the missing code
         }", // etc. etc. 

在您的代码中的某个地方,也可能会解析 json 字符串。所以你会写:(例如使用谷歌GSon)

Gson gson = new Gson();
JsonReader reader = new JsonReader(new FileReader(filename));
Rectangle rect1 = gson.fromJson(reader, RECTANGLE_TYPE); // see link below for further details
GraphSpace graphSpace = gson.fromJson(reader, GRAPHSPACE_TYPE);

// at this stage you have parsed in all the json file. 
// but you may wish to continue and parse the stringified value of the graphSpace.rectangle so: 
string rectString = graphSpace[0][0].rectangle;
Rectangle graphRect = gson.fromJson(rectString, RECTANGLE_TYPE);
// or use a `for` loop to loop through the rectangle strings in graphSpace...

在 Java 中,有一种读取 JSON 的内置方法,并且有许多很好的库可以这样做。

于 2018-09-03T08:23:50.500 回答