解析具有JSON格式列的外部文件

时间:2019-05-07 21:41:25

标签: java arrays json parsing graph

我是这个网站的新手,所以如果我做错了事,请告诉我。我正在凯文·培根(Kevin Bacon)的6度项目上工作,该项目需要一个外部CSV文件并读取未加权图中的所有数据,并允许运行该项目的用户找到从凯文·培根到另一个人的最短路径距离。我坚持要找出如何正确读取CSV文件中所有数据的方法,因为该列中有四分之二包含JSON格式的条目。

我很高兴看到我遇到的任何事情,并随时请我详细说明您是否需要我:)

我已经尝试实现JSON简单解析器,并且我坚持使用它,因为它易于安装并且其功能相当简单。外部CSV文件太大,但是看起来是这样的:

/*
movie_id,title,cast,crew
19995,Avatar,"[{""cast_id"": 242, ""character"": ""Jake Sully"", ""credit_id"": ""5602a8a7c3a3685532001c9a"", ""gender"": 2, ""id"": 65731, ""name"": ""Sam Worthington"", ""order"": 0}, {""cast_id"": 3, 
*/

这是我尝试过的:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.Scanner;
import org.json.simple.parser.JSONParser;


public class MrBacon {



    public static void main(String[] args) throws Exception
    {
        // TODO Auto-generated method stub
        JSONParser parser = new JSONParser();

        if(args.length < 2)
        {
            throw new Exception("Input File Error");
        }
        Scanner reader = new Scanner(new FileInputStream(args[0]));

        int size = 5000;
        Graph graph = new Graph(size);

        try
        {
            BufferedReader br = new BufferedReader(new FileReader("tmdb_5000_credits.csv"));
            StringBuilder st = new StringBuilder();
            String title, line;
            String[] actors; 

            while((line = br.readLine())!= null)
            {
                   int col = 0;
                   char [] words = line.toCharArray();
                   for(int i = 0; i < words.length; i ++)
                   {   
                       if(words[i] == ',')
                       {
                          col++;

                       }

                       else if(words[i] = )
                       {

                       }


            }
        }
    }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果数据源是一个且未更改,则可以使用具有方便的“解析JSON”功能的this online CSV to JSON converter,该功能将转换castcrew列中的JSON值到嵌套的JSON对象中。

然后,您将使用JSON.simpleGsonJackson来解析纯JSON数据。

例如,

movie_id,title,cast,crew
19995,Avatar,"[{""cast_id"": 242, ""character"": ""Jake Sully"", ""credit_id"": ""5602a8a7c3a3685532001c9a"", ""gender"": 2, ""id"": 65731, ""name"": ""Sam Worthington"", ""order"": 0}]",null

成为:

[
  {
    "movie_id": 19995,
    "title": "Avatar",
    "cast": [
      {
        "cast_id": 242,
        "character": "Jake Sully",
        "credit_id": "5602a8a7c3a3685532001c9a",
        "gender": 2,
        "id": 65731,
        "name": "Sam Worthington",
        "order": 0
      }
    ],
    "crew": null
  }
]

如果这不可行,例如,您可能会告诉CSV解析库在引号中找到分隔符时忽略分隔符。

如果使用Opencsv,请查看CSVParserBuilder类。它有一个#withIgnoreQuotations(boolean)方法可以完成这项工作。 以下内容来自CSVReaderBuilder类的说明。

CSVParser parser = new CSVParserBuilder()
        .withSeparator(',')
        .withQuoteChar('"')
        .withIgnoreQuotations(true)
        .build();
CSVReader reader = new CSVReaderBuilder(new FileReader("tmdb_5000_credits.csv"))
        .withSkipLines(1)
        .withCSVParser(parser)
        .build();

我个人喜欢杰克逊图书馆。它开箱即用地支持JSON,并且可以扩展以支持许多其他格式,例如YAMLCSV