Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用GSON库将自由文本转换为Json字符串数组?_Java_Json_Gson - Fatal编程技术网

如何在Java中使用GSON库将自由文本转换为Json字符串数组?

如何在Java中使用GSON库将自由文本转换为Json字符串数组?,java,json,gson,Java,Json,Gson,我有免费的文本到文件中。 在将其转换为json字符串数组时,我感到很笨拙 列名称是可变的,可以是n个列 email_from,email_to,DATE_CHANGED samwilliams@gmail.com, mike_haley@gmail.com, 1447666867 smithpaul@gmail.com, angierussell@gmail.com, 1447668867 第一行是标题,其余的行是它们的值。 因此,每一行都将包含关于每一列的相同数量的参数。 列以逗号分隔

我有免费的文本到文件中。 在将其转换为json字符串数组时,我感到很笨拙

列名称是可变的,可以是n个列

email_from,email_to,DATE_CHANGED

samwilliams@gmail.com, mike_haley@gmail.com, 1447666867

smithpaul@gmail.com, angierussell@gmail.com, 1447668867
第一行是标题,其余的行是它们的值。 因此,每一行都将包含关于每一列的相同数量的参数。 列以逗号分隔

json字符串响应应该如下所示

{
 "data": [
    {
        "email_from": "samwilliams@gmail.com",
        "email_to": "mike_haley@gmail.com",
        "DATE_CHANGED": "1447666867"
    },
    {
        "email_from": "smithpaul@gmail.com",
        "email_to": "angierussell@gmail.com",
        "DATE_CHANGED": "1447668867"
    }
 ]
}
请尝试以下代码:

public class ContactObject {
    private String emailFrom;
    private String emailTo;
    private String dateChanged;

    public ContactObject(String emailFrom, String emailTo, String dateChanged) {
        this.emailFrom = emailFrom;
        this.emailTo = emailTo;
        this.dateChanged = dateChanged;
    }

    @Override
    public String toString() {
        return "{email_from:" + emailFrom + ", email_to:" + emailTo + ", DATE_CHANGED:" + dateChanged;
    }
}

public class ContactJSON {
    private List<ContactObject> data;

    public ContactJSON(List<ContactObject> contactList) {
        this.data = contactList;
    }
}
输出:

{"data":[{"emailFrom":"samwilliams@gmail.com","emailTo":"mike_haley@gmail.com","dateChanged":"1447666867"},{"emailFrom":"smithpaul@gmail.com","emailTo":"angierussell@gmail.com","dateChanged":"1447668867"}]}

下面的代码使用逗号分隔的字符串打开一个文件,并使用while循环构造JsonObject,然后继续将它们添加到JsonArray并最终打印它(请添加验证,如果希望使代码性能更好,您可以将大部分代码移出try块)

它解决了在文件中有n个列的需要

package gjson;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class GJSONTest {
    public static void main(String[] args) {

        // create an array called datasets
        JsonArray datasets = new JsonArray();

        File file = new File("C:\\test_stackoverflow\\list.txt");

        try (BufferedReader br = new BufferedReader(new FileReader(file)))  {
            String line;
            boolean flag = true; 
            List<String> columns = null; 
            while ((line = br.readLine()) != null) {
               if (flag) {
                   flag = false; 
                   //process header 
                   columns = Arrays.asList(line.split(","));
               } else {
                   //to store the object temporarily
                   JsonObject obj = new JsonObject(); 
                   List<String> chunks = Arrays.asList(line.split(","));

                   for(int i = 0; i < columns.size(); i++) {
                       obj.addProperty(columns.get(i), chunks.get(i));
                   }
                   datasets.add(obj); 
               } 
            }
        } catch(FileNotFoundException fnfe) {
            System.out.println("File not found.");
        } catch(IOException io) {
            System.out.println("Cannot read file.");
        }

        Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
        System.out.println(gson.toJson(datasets));
    }
}
gjson包;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.array;
导入java.util.List;
导入com.google.gson.FieldNamingPolicy;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入com.google.gson.JsonArray;
导入com.google.gson.JsonObject;
公开课考试{
公共静态void main(字符串[]args){
//创建一个名为dataset的数组
JsonArray数据集=新的JsonArray();
File File=新文件(“C:\\test\u stackoverflow\\list.txt”);
try(BufferedReader br=new BufferedReader(new FileReader(file))){
弦线;
布尔标志=真;
列表列=null;
而((line=br.readLine())!=null){
国际单项体育联合会(旗){
flag=false;
//进程头
columns=Arrays.asList(line.split(“,”);
}否则{
//临时存储对象的步骤
JsonObject obj=新的JsonObject();
列表块=Arrays.asList(line.split(“,”);
对于(int i=0;i
请参阅以下屏幕截图(下面有3列)

在文本文件中添加了另一列,下面是输出

下面是包含您的数据的sample.txt文件

私有字符串getParsedData(字符串数据){
字符串[]行=数据。拆分(\\r?\\n”);
List dataList=new ArrayList();
int colCount=0;
如果(lines.length>1){
字符串键线=行[0];
String[]keys=keyLine.split(“,”);
对于(int i=1;i

但是我不确定这是否是一个有效的代码。

此外,列可以是不同的,也可以是“n”号。如果你想要GSON,具体来说,你为什么不在问题中这样说?嗨,蒂姆,谢谢你的代码,它会起作用,但问题是列名不是固定的。它可以是不同的,可以是n个数字。因此,我很难创建动态脚本,它的列名可以在运行时处理。我不完全确定您的意思。你能更新你的问题来反映这一点吗?在上面的问题中,我提到了“列名称是可变的,可以是n个列”。。这意味着,您可以有任何列名,因此我们无法创建POJO类以将其序列化为json。因此,在运行时,email\u from、email\u to、DATE\u更改的列名可能会有所不同,我们需要以这种方式进行处理。为什么不为任意数量的项使用列表呢?是的,它工作得很好。谢谢:)下面的代码我也试过了。它也起作用了。很高兴知道!您有几个选项可供选择。我在回答中使用try/catch块的原因是,我假设您正在读取文件中的数据,但我认为此回答中不需要try/catch块,因此您可以删除它。我决定使用泛型(list和hashmap),但后来我注意到我可以在不使用它们的情况下完成任务,因此我给出了答案。如果没有弄错的话,在使用/不使用list和hashmap完成任务时,性能应该有所不同,但是,性能差异可能很小,难以观察或产生影响。
package gjson;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class GJSONTest {
    public static void main(String[] args) {

        // create an array called datasets
        JsonArray datasets = new JsonArray();

        File file = new File("C:\\test_stackoverflow\\list.txt");

        try (BufferedReader br = new BufferedReader(new FileReader(file)))  {
            String line;
            boolean flag = true; 
            List<String> columns = null; 
            while ((line = br.readLine()) != null) {
               if (flag) {
                   flag = false; 
                   //process header 
                   columns = Arrays.asList(line.split(","));
               } else {
                   //to store the object temporarily
                   JsonObject obj = new JsonObject(); 
                   List<String> chunks = Arrays.asList(line.split(","));

                   for(int i = 0; i < columns.size(); i++) {
                       obj.addProperty(columns.get(i), chunks.get(i));
                   }
                   datasets.add(obj); 
               } 
            }
        } catch(FileNotFoundException fnfe) {
            System.out.println("File not found.");
        } catch(IOException io) {
            System.out.println("Cannot read file.");
        }

        Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
        System.out.println(gson.toJson(datasets));
    }
}
private String getParsedData(String data){

    String[] lines = data.split("\\r?\\n");

    List<Map> dataList = new ArrayList<Map>();


    int colCount = 0;

    if(lines.length > 1){

        String keyLine = lines[0];

        String[] keys = keyLine.split(",");

        for(int i = 1; i < lines.length; i++){

            colCount = 0;
            Map<String, Object> rawObj = new HashMap<String, Object>();

            try {

                String[] values = lines[i].split(",");

                for(String value: values){

                    rawObj.put(keys[colCount], value);
                    colCount++;
                }   

            } catch (Exception e) {

            }

            dataList.add(rawObj);
        }
    }


    Map<String, Object> rawObj = new HashMap<String, Object>();
    rawObj.put("data", dataList);
    Gson gson = new Gson();

    String res = gson.toJson(rawObj);

    return res;
}

String data = "email_from,email_to,DATE_CHANGED\r\nsamwilliams@gmail.com, mike_haley@gmail.com, 1447666867\r\nsmithpaul@gmail.com, angierussell@gmail.com, 1447668867";