将JSON文件转换为字符串。

9

我对Java比较陌生,遇到了一个问题不知道如何解决。我看了一些教程,发布了一些问题,但仍然无法理解如何将这些知识应用于解决我的问题。

这是我的问题:

我想在一个地方读取多个json文件并将数据转换为字符串。我可以读取json中的一个数据条目,但不是更多。 :-|

文件数据如下:

{
    "Header":{
        "Liste1": {
            "ID": "12345",
            "Name" : "customerlist",
            "Company List": [
                "Company": "c1",
                "Company": "c2",
                "Company": "c3"
            ]
        },
        "Liste2":{
            "ID": "12346",
            "Name" : "vendorlist",
            "Company List": [
                "Company": "c4",
                "Company": "c5",
                "Company": "c6"
            ]
        }
    }
}

我使用的代码是Main:
package testpaket;

import com.google.gson.Gson;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class test6 {

    public static void main(String[] args) {

        Gson gson = new Gson();

        try (Reader reader = new FileReader("test.json")) {

            // Convert JSON to Java Object
            Header header = gson.fromJson(reader, Header.class);
            System.out.println(header);

            // Convert JSON to JsonElement, and later to String
            /*JsonElement json = gson.fromJson(reader, JsonElement.class);
            String jsonInString = gson.toJson(json);
            System.out.println(jsonInString);*/



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

    }

}

我的列表类。
package testpaket;

import java.util.List;

public class Lists {

    private String List;
    private int ID;
    private String Name;
    private List<String> companyList;

}

我的标题类。

package testpaket;

import java.util.Map;

public class Header {

        String name;
        String list;
        int id;
        String header1;


        private Map<String, Lists> header;


        //getters&setters
        public String getHeader() { 
              return this.header1; 
        }
        public void setHeader(String header) { 
            this.header1 = header1; 
        }
        public String getList() { 
              return this.list; 
        }
        public void setList(String list) { 
            this.list = list; 
        }
        public String getName() { 
              return this.name; 
        }
        public void setName(String name) { 
            this.name = name; 
        }
        public int getID() { 
              return this.id; 
        }
        public void setID(int id) { 
            this.id = id; 
        }
}

这些内容有没有让你感到困惑?抱歉,我已经尽力传达我目前拥有的知识了。请问有谁能帮帮我,告诉我如何解决它?


你希望字符串结构是怎样的? - Rafael Almeida
谢谢 Rafael 快速回复。我认为它需要一个字符串,以每个列分隔,因为我想要展开数据并将其插入到数据库中。 - lars
也许我应该补充一下,我正在尝试为Apache Pig构建一个UDF。有点类似于你在这里找到的UDF [链接](https://wiki.apache.org/pig/UDFManual)。 - lars
@Iars,只是一个想法:如果您想插入数据库,请不要将其转换为字符串。将您的JSON映射到“Header”对象列表中,循环遍历所有对象并访问要上传到数据库的属性。 - Alex
@Alex,有趣的想法。我从未考虑过这一点,因为我不知道这个选项的存在。^^叫我菜鸟。:D - lars
没问题,我建议学习更多关于对象映射框架,例如Hibernate,它可以让你将整个对象保存、获取、更新、删除到数据库中。 - Alex
4个回答

14

如果您想将JSON文件转换为字符串,不需要先将文件转换为Java对象再转换为字符串。使用Apache commons-io库,只需要一行代码即可实现。

String exampleRequest = FileUtils.readFileToString(new File("exampleJsonRequest.json"), StandardCharsets.UTF_8);

1
首先,对象与json不匹配。 Header对象应该包含两个类似于Liste1和Liste2的字段(可能是相同类型)。另一方面,这些字段应该包含id、name和companyList字段。 另外,你创建了json吗?Liste1和Liste2可能应该是json中集合的一部分,在“[]”括号内,然后在Header对象中而不是有两个像Liste1和Liste2这样的字段,你可以有集合。

首先感谢您的帮助。是的,我刚试图修改一个示例,但我猜这没起作用。您的意思是像这样吗?{"Header":{["Liste1": {"ID": "12345","Name" : "customerlist","Company List": ["Company": "c1",...]}],["Liste2":{"ID": "12346",...,"Company": "c6"]}]}}?哦,Liste只是表示列表,所以是list1和list2。 - lars
{ "Header": [ { "ID": "12345", "Name": "customerlist", "Company List": [ { "Company": "c1" } ] }, { "ID": "12346", "Name": "vendorlist", "Company List": [ { "Company": "c6" } ] } ] } - kolakao
好的,假设我使用您提供的结构。{“Header”:[{“ID”:“12345”,“Name”:“customerlist”,“Company List”:[{“Company”:“c1”,“Company”:“c2”,“Company”:“c3”}]},{“ID”:“12346”,“Name”:“vendorlist”,“Company List”:[{“Company”:“c4”,“Company”:“c5”,“Company”:“c6”}]}]} List1和List2部分已经过时了,对吗?我还需要Lists类吗? 很抱歉我不得不问,但您能否向我展示修改标题对象的含义? 而不是:Header header = gson.fromJson(reader, Header.class); 我该怎么做? - lars
@lars 现在你的Header类应该像这样:`public class Header { private Collection<Lists> lists; public void setLists(Collection<Lists> lists){ this.lists = lists; } public Collection<Lists> getLists(){ return this.lists; } }`然后它应该可以正常工作了。我没有使用GSon,但我相信它的工作方式与Jackson类似。 - kolakao
谢谢您的帮助。我得到了一个结果testpaket.Header @ f7f36a,但这不是我期望的结果。似乎我还是出错了。:| - lars

1
这里是使用GSON的完整解决方案:
package jsonProcessing;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonHeader {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub  
    BufferedReader reader = null;

    try{
        reader = new BufferedReader(new FileReader("C:/JSON/header.json"));
        Gson gson = new GsonBuilder().create();
        HeaderResult results = gson.fromJson(reader, HeaderResult.class);

        if(results != null){
            for(Header h : results.getHeader()){
                String temp =("ID: "+h.getID()+" Name: "+h.getName());
                for(CompanyList cl : h.getCompanyList()){
                    System.out.println(temp+" "+"Company: "+cl.getCompany());
                }
            }
        }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(reader != null){
                try{
                    reader.close();
                }catch(Exception e){
                    e.printStackTrace();
                }

            }
        }
}
}

package jsonProcessing;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class HeaderResult {

@SerializedName("Header")
@Expose
private List<Header> header = null;

public List<Header> getHeader() {
return header;
}

public void setHeader(List<Header> header) {
this.header = header;
}
}

package jsonProcessing;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Header {

@SerializedName("ID")
@Expose
private String iD;
@SerializedName("Name")
@Expose
private String name;
@SerializedName("Company List")
@Expose
private List<CompanyList> companyList = null;

public String getID() {
return iD;
}

public void setID(String iD) {
this.iD = iD;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<CompanyList> getCompanyList() {
return companyList;
}

public void setCompanyList(List<CompanyList> companyList) {
this.companyList = companyList;
}
}

package jsonProcessing;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class CompanyList {

@SerializedName("Company")
@Expose
private String company;

public String getCompany() {
return company;
}

public void setCompany(String company) {
this.company = company;
}
}

最后的输出:
ID: 12345 Name: customerlist Company: c1
ID: 12346 Name: vendorlist Company: c6

0

这是一个示例,展示如何将JSON文件读取为字符串。假设我们有一个位于“src/test/resources/sample.json”的JSON文件。

public class ReadJsonAsString {

    public static void main(String[] args) throws Exception {
        String file = "src/test/resources/sample.json";
        String json = readFileAsString(file);
        System.out.println(json);
    }
    public static String readFileAsString(String file)throws Exception
    {
        return new String(Files.readAllBytes(Paths.get(file)));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接