如何在Java中使用GSON库将自由文本转换为Json字符串数组?
我有免费的文本到文件中。 在将其转换为json字符串数组时,我感到很笨拙 列名称是可变的,可以是n个列如何在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 第一行是标题,其余的行是它们的值。 因此,每一行都将包含关于每一列的相同数量的参数。 列以逗号分隔
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";