Java 无法使用GSON解析JSON文件
我有一个非常简单的JSON文件,需要从中获取字段名和值。我在eclipse中使用Java1.7和gson。这是我的JSON文件:Java 无法使用GSON解析JSON文件,java,json,gson,Java,Json,Gson,我有一个非常简单的JSON文件,需要从中获取字段名和值。我在eclipse中使用Java1.7和gson。这是我的JSON文件: { "header": [ { "document_number": "document_number", "report": "report", "version": "version" } ], "summary": [ { "
{
"header": [
{
"document_number": "document_number",
"report": "report",
"version": "version"
}
],
"summary": [
{
"row_type": "row_type",
"crs_id": "crs_id",
"report_begin": "report_begin",
"report_end": "report_end",
"gross_tax": "gross_tax",
"compensating_tax": "compensating_tax",
"withholding_tax": "withholding_tax",
"total_due_tax": "total_due_tax",
"penalty": "penalty",
"interest": "interest",
"total_due_due": "total_due_due"
}
],
"detail": [
{
"row_type": "row_type",
"county_name": "county_name",
"rate_type": "rate_type",
"location_code": "location_code",
"gross_receipts": "gross_receipts",
"deductions": "deductions",
"taxable_gross_receipts": "taxable_gross_receipts",
"tax_rate": "tax_rate","gross_tax": "gross_tax"
}
]
}
我需要在知道不同字段名称的情况下浏览文件。在我看来,我希望加载JSON文件,然后返回第一个字段值(在本例中为header)。然后返回该根下的字段名和值。抱歉,如果我的术语不适用,我是JSON新手。我在网上找到了不同的gson文档,这太可怕了。在不知道字段名的情况下,我找不到任何用于提取值的内容。谢谢这是代码。有关更多信息,请阅读内联评论或询问我 创建一些作为JSON字符串副本的POJO类
class MyJSON {
ArrayList<Header> header;
ArrayList<Summary> summary;
ArrayList<Detail> detail;
}
class Header {
String document_number;
String report;
String version;
}
// create classes for Summary and Detail as well in the similar way of Header
// the variable name must be same as it is in JSON string along with case.
...
// read JSON from the file
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(new File("resources/json1.txt")));
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
reader.close();
// create a new Gson object
Gson gson = new Gson();
// convert JSON string to POJO object
MyJSON object = gson.fromJson(builder.toString(), MyJSON.class);
// printing only header
for (Header header : object.header) {
System.out.println(header.document_number + ", " + header.report + ", "
+ header.version);
}
这是我的准备运行解决方案
package stackoverflow.questions;
import java.util.*;
import com.google.gson.*;
public class Q23704415 {
public static void main(String[] args) {
String json = "{ "+
" \"header\": [ "+
" { "+
" \"document_number\": \"document_number\", "+
" \"report\": \"report\", "+
" \"version\": \"version\" "+
" } "+
" ], "+
" "+
" \"summary\": [ "+
" { "+
" \"row_type\": \"row_type\", "+
" \"crs_id\": \"crs_id\", "+
" \"report_begin\": \"report_begin\", "+
" \"report_end\": \"report_end\", "+
" \"gross_tax\": \"gross_tax\", "+
" \"compensating_tax\": \"compensating_tax\", "+
" \"withholding_tax\": \"withholding_tax\", "+
" \"total_due_tax\": \"total_due_tax\", "+
" \"penalty\": \"penalty\", "+
" \"interest\": \"interest\", "+
" \"total_due_due\": \"total_due_due\" "+
" } "+
" ], "+
" "+
" \"detail\": [ "+
" "+
" { "+
" "+
" \"row_type\": \"row_type\", "+
" \"county_name\": \"county_name\", "+
" \"rate_type\": \"rate_type\", "+
" \"location_code\": \"location_code\", "+
" \"gross_receipts\": \"gross_receipts\", "+
" \"deductions\": \"deductions\", "+
" \"taxable_gross_receipts\": \"taxable_gross_receipts\", "+
" \"tax_rate\": \"tax_rate\",\"gross_tax\": \"gross_tax\" "+
" "+
" } "+
" "+
" ] "+
" "+
"} ";
JsonElement root = new JsonParser().parse(json);
JsonObject jo = root.getAsJsonObject();
JsonObject header = jo.get("header").getAsJsonArray().get(0).getAsJsonObject();
Set<Map.Entry<String, JsonElement>> set = header.entrySet();
for(Map.Entry<String, JsonElement> e : set){
System.out.println(e.getKey() + "->" + e.getValue());
}
}
}
基本上遍历JSON以获得正确的信息。我忘记了:这是我代码的结果:
document_number->"document_number"
report->"report"
version->"version"
将JSON转换为一个对象,然后遍历该对象。是的,只需将数据读入列表和映射,并“原始”处理即可。对于大多数工具包,如果您需要,可以通过多种方式请求地图键列表。请注意,JSON不能保证“对象”(Map)中元素的顺序——在序列化/反序列化过程中,顺序可以在任何地方更改,而且许多Map实现都不维护order.BTW,请访问JSON.org并学习JSON语法。它只需要5-10分钟,如果你知道语法的意思,事情就更容易理解了。你拥有的是一个包含header、summary和detail元素的对象(Map)。每个元素本身就是一个数组(列表),可能包含多个对象(映射)。
JsonObject header = jo.get("header").getAsJsonArray().get(0).getAsJsonObject();
document_number->"document_number"
report->"report"
version->"version"