【问题标题】:Convert JSON file to String将 JSON 文件转换为字符串
【发布时间】:2016-08-28 08:07:35
【问题描述】:

我是 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;

}

我的 Header 类。

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 的快速回复。我认为它需要为每一列分隔一个字符串,因为我想取消嵌套数据并将其插入数据库。
  • 也许我应该在,我正在尝试为 Apache pig 构建一个 udf。有点像你在这里找到的link
  • @Iars,只是一个想法:如果要插入数据库,请不要转换为字符串。将您的 json 映射到 Header 对象列表中,遍历所有对象并访问您要上传到数据库的属性。
  • @Alex,有趣的想法。我从未考虑过这一点,因为我不知道 Option 存在。 ^^ 叫我菜鸟。 :D

标签: java json parsing


【解决方案1】:

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

【讨论】:

  • 您好,首先感谢您的帮助。是的,我只是尝试修改一个示例,但我想这不起作用。你的意思是这样吗。 {“标题”:{[“Liste1”:{“ID”:“12345”,“名称”:“customerlist”,“公司列表”:[“公司”:“c1”,...]}],[ “Liste2”:{“ID”:“12346”,...,“公司”:“c6”]}]}}?哦,Liste 只是意味着列表,所以 list1 list2.
  • 类似这样:{ "Header": [ { "ID": "12345", "Name": "customerlist", "Company List": [ { "Company": "c1" } ] }, { "ID": "12346", "Name": "vendorlist", "Company List": [ { "Company": "c6" } ] } ] } 将其粘贴到任何可以为您格式化的 IDE,您会非常清楚地看到整个层次结构
  • 好的,假设我使用您提供的结构。 {“标题”:[{“ID”:“12345”,“名称”:“客户列表”,“公司列表”:[{“公司”:“c1”,“公司”:“c2”,“公司”: "c3" } ] }, { "ID": "12346", "Name": "vendorlist", "公司列表": [ { "Company": "c4","Company": "c5","Company" : "c6" } ] } ] } List1 和 List2 部分已经过时了,对吗?我什至需要 Lists 类了吗?对不起,我不得不问,但你能告诉我你的意思是修改标题对象吗?而不是: Header header = gson.fromJson(reader, Header.class);我做什么?
  • @lars 现在你的 Header 类应该是这样的:public class Header { private Collection&lt;Lists&gt; lists; public void setLists(Collection&lt;Lists&gt; lists){ this.lists = lists; } public Collection&lt;Lists&gt; getLists(){ return this.lists; } } 然后它应该可以工作了。我没有使用 GSon,但我相信它与 Jackson 类似。
  • 感谢您的帮助。我得到一个结果 testpaket.Header@f7f36a 但这不是我所期望的。好像我在某个地方仍然有错误。 :|
【解决方案2】:

这里是使用 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

【讨论】:

    【解决方案3】:

    如果您想将 JSON 文件转换为字符串,则不必将文件转换为 Java 对象,然后再转换为字符串。使用 apache commons-io 库,您可以使用 only 1 行来做到这一点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2020-04-26
      • 2016-09-18
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多