如何解析具有多个数组的 JSON 文件?

How do I parse a JSON file with multiple arrays?

所以我有一个包含多个数组的 JSON 文件。 "data" 包含一大堆单词,每个单词包含 "clues"。我已经用一个数组解析了一个 JSON 文件,但我不确定如何解析它。我知道JSON对象被{}包围,JSON数组被[]包围,所以"data"应该是一个JSON对象,每个单词都是一个数组。

{
  "data":{
     "abase":[
       "put down",
       "humiliate",
       "cut down",
     ],
     "abate":[
       "diminish",
       "let up",
     ],
     "abbot":[
      "monastery head",
      "monastic title",
     ]
 }
}

我可以用单个数组解析 JSON 文件并从数据中创建对象:

JSONObject allThings = loadJSONObject("filename.json");
JSONArray arr = getJSONArray("titleofarray");
for (int x = 0; x<=arr.size(); x++){
    String fieldOne = arr.getJSONObject(x).getString("firstField");
    int fieldTwo = arr.getJSONObject(x).getInt("secondField");
}

我可以创建一个 JSON 数组的 ArrayList 并使用 for-each 将文件中的每个数组添加到该 ArrayList 吗?抱歉,如果我对我的问题不是 100% 清楚,很难针对您不理解的问题提出问题,但如果您需要澄清,请告诉我,我很乐意进一步详细解释。

编辑:我正在使用 Processing/Java

将您的问题分解成更小的步骤。

第 1 步:你能找到 JSON 中的 data 对象吗?

您可以调用 loadJSONObject() 函数加载所有 JSON,然后调用 getJSONObject() 获取 data 对象:

JSON对象json = 加载JSON对象("data.json"); JSON对象数据=json.getJSONObject("data"); println(数据);

第2步:你能得到data对象里面的三个字段吗?

我认为没有标准的、开箱即用的方法可以使用 Processing 的 JSONObject 遍历每个字段。所以你必须手动获取它们:

JSONObject json = loadJSONObject("data.json");
JSONObject data = json.getJSONObject("data");
JSONArray abase = data.getJSONArray("abase");
JSONArray abate = data.getJSONArray("abate");
JSONArray abbot = data.getJSONArray("abbot");
println(abase);
println(abate);
println(abbot);

第 3 步: 现在您已经有了 JSONArray 个实例,您想用它们做什么?

一旦你有了 JSONArray 个实例,你可以对它们做任何你想做的事,包括遍历每个实例并将它们的内容添加到单个 ArrayList.

如果您想编写循环遍历字段本身的代码,那么您必须自己编写。谷歌搜索 "Java get json object field names" returns 一大堆结果。

除了 Kevin 的回答之外,您还可以遍历 JSONObject 的 keys():

  JSONObject associative = loadJSONObject("associative.json");
  JSONObject associativeData = associative.getJSONObject("data"); 

  ArrayList<JSONArray> listA = new ArrayList<JSONArray>(); 

  for(Object key : associativeData.keys()){
    String keyName = (String)key;
    JSONArray data = associativeData.getJSONArray(keyName);
    println(keyName,"=",data);
    listA.add(data);
  }

  System.err.println(listA);

associative.json:

{
  "data":{
     "abase":[
       "put down",
       "humiliate",
       "cut down"
     ],
     "abate":[
       "diminish",
       "let up"
     ],
     "abbot":[
      "monastery head",
      "monastic title"
     ]
 }

}

您还可以重新组织 JSON 数据,使其符合您的目标。 当前,您在 JSON 对象(关联数组)中有单词和同义词。 您可以轻松地将其转换为 JSON 数组并构造数据,因此很容易 access/parse。例如: array.json

{
  "data":[
     {
      "word":"abase",
      "synonyms":[
         "put down",
         "humiliate",
         "cut down"
         ]
      },
      {
        "word":"abate",
        "synonyms":[
           "diminish",
           "let up"
        ]
     },
     {
        "word":"abbot",
        "synonyms":[
          "monastery head",
          "monastic title"
        ]
      }
  ]
 }

如果你愿意,你仍然可以制作一个 ArrayList,但你不应该真的需要它,你可以直接轻松地访问每个单词和同义词。 不必 convert/parse 并且只访问您需要的内容应该更简单:

ArrayList<JSONArray> listB = new ArrayList<JSONArray>(); 

  JSONObject array = loadJSONObject("array.json");
  JSONArray arrayData = array.getJSONArray("data");
  for(int i = 0 ; i < arrayData.size(); i++){
    JSONObject data = arrayData.getJSONObject(i);
    println("\t",data.getString("word"),"=",data.getJSONArray("synonyms"));

    listB.add(data.getJSONArray("synonyms"));
  }

  System.err.println(listB);

更新 下面是在屏幕上呈现文本的示例:

import processing.data.*;

void setup(){
  size(400,400);
  background(0);

  int textX = 10;
  int textY = 20;

  JSONObject array = loadJSONObject("array.json");
  JSONArray arrayData = array.getJSONArray("data");
  for(int i = 0 ; i < arrayData.size(); i++){
    JSONObject data = arrayData.getJSONObject(i);
    String word = data.getString("word");
    JSONArray synonyms = data.getJSONArray("synonyms");
    println(word,"=",synonyms);

    //render on screen
    text(word.toUpperCase(),textX,textY);
    for(int j = 0 ; j < synonyms.size(); j++){
      String synonym = synonyms.getString(j);
      text(synonym,textX,textY + (textY * (j+1)));
    }

    //increment x position for next word
    textX += 100;
  }

}

更新 2 下面是一个封装示例,在将鼠标悬停在单词上时使用概念验证提示显示:

import processing.data.*;

ArrayList<Word> words = new ArrayList<Word>(); 

void setup(){
  size(400,400);

  int textX = 10;
  int textY = 20;

  JSONObject array = loadJSONObject("array.json");
  JSONArray arrayData = array.getJSONArray("data");
  for(int i = 0 ; i < arrayData.size(); i++){
    JSONObject data = arrayData.getJSONObject(i);
    String word = data.getString("word");
    JSONArray synonyms = data.getJSONArray("synonyms");
    println(word,"=",synonyms);

    words.add(new Word(textX,textY,"hint #"+(i+1),data));

    //increment x position for next word
    textX += 100;
  }

}

void draw(){
  background(0);
  for(Word word : words){
    word.draw();
  }
}

class Word{
  String hint = "...";
  JSONObject data;

  float x,y;
  float textWidth;
  float textHeight = 20;



  Word(float x,float y,String hint,JSONObject data){
    this.x = x;
    this.y = y;
    this.hint = hint;
    this.data = data;
    textWidth = textWidth(data.getString("word"));
  }

  void draw(){
    fill(255);
    String word = data.getString("word");
    JSONArray synonyms = data.getJSONArray("synonyms");
    text(word.toUpperCase(),x,y);
    for(int j = 0 ; j < synonyms.size(); j++){
      String synonym = synonyms.getString(j);
      text(synonym,x,y + (textHeight * (j+1)));
    }
    fill(0,192,0);
    //hint tooltip
    //if mouse within word bounding box
    if((mouseX >= x && mouseX <= x + textWidth) &&
       (mouseY >= y-textHeight && mouseY <= y)){
         //render the text at mouse coordinates
         //be aware that y is the base of the text -> be sure to check out the reference for text functions (e.g. textAscent(),textDescent(),etc.)
      text(hint,mouseX,mouseY+textHeight);  
    }


  }


}