处理 json 文件的一部分
process part of json file
我有一个 json
文件,看起来像这样
{
"races": [
{
"name" : "ORC"
},
{
"name" : "HUMAN"
},
{
"name" : "ELF"
}
],
"npc": [
{
"race" : "HUMAN",
"age" : "25",
"name" : "Jerome"
},
{
"race" : "ORC",
"age" : "26",
"name" : "Rz'Ul"
}
]
}
我想根据需要分别从 races
或 npc
中检索数据。我正在使用 genson
来解析 JSON
。我这样解析
@SuppressWarnings("unchecked")
public static <T> List<T> readJsonList(String listName) {
Genson genson = JsonContext.PARSER.getParser();
List<T> result = null;
try (InputStream is = JsonDataProcessor.class.getResourceAsStream(FILE)) {
ObjectReader reader = genson.createReader(is);
reader.beginObject();
while (reader.hasNext()) {
reader.next();
if ("races".equals(listName) && "races".equals(reader.name())) {
result = (List<T>) processRaceData(reader);
break;
}
if ("npc".equals(listName) && "npc".equals(reader.name())) {
result = (List<T>) processNpcData(reader);
break;
}
}
reader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
例如,解析 races
的方法如下所示
private static List<Race> processRaceData(ObjectReader reader) {
List<Race> raceList = new ArrayList<>();
reader.beginArray();
while (reader.hasNext()) {
reader.next();
Race race = new Race();
reader.beginObject();
while (reader.hasNext()) {
reader.next();
if ("name".equals(reader.name())) { race.setName(reader.valueAsString()); }
else { reader.skipValue(); }
}
reader.endObject();
raceList.add(race);
}
reader.endArray();
return raceList;
}
在调试中 populates
变量 result
很好,但是在 endObject
行我得到异常
Exception in thread "main" com.owlike.genson.stream.JsonStreamException: Illegal character at row 11 and column 4 expected } but read ',' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:942)
at com.owlike.genson.stream.JsonReader.end(JsonReader.java:428)
at com.owlike.genson.stream.JsonReader.endObject(JsonReader.java:177)
at com.lapots.breed.platform.json.JsonDataProcessor.readJsonList(JsonDataProcessor.java:41)
at com.lapots.breed.platform.Example.prepareDb(Example.java:18)
at com.lapots.breed.platform.Example.main(Example.java:23)
有什么问题?
我玩过你的代码,发现 genson 期望在你调用 endObject
时关闭对象并检查 }
符号。您只需要使用 reader.skipValue()
跳过对象。所以错误在 readJsonList
方法中的 while
块中。这段代码应该适合你:
@SuppressWarnings("unchecked")
public static <T> List<T> readJsonList(String listName) {
. . .
while (reader.hasNext()) {
reader.next();
if ("races".equals(listName) && "races".equals(reader.name())) {
result = result = (List<T>) processRaceData(reader);
break;
}
if ("npc".equals(listName) && "npc".equals(reader.name())) {
result = result = (List<T>) processNpcData(reader);
break;
}
reader = reader.skipValue();
}
reader.endObject();
. . .
你为什么不使用 Genson 的数据绑定功能,让它为你做 skipValue 和映射?
您可以定义两个数据结构,一个用于比赛,另一个用于 npc,然后像这样反序列化它们:
class Races {
public List<Race> races;
}
class Npcs {
public List<Npc> npc;
}
// This will skip npc and all the fields in it
Races races = genson.deserialize(inputStream, Races.class);
与使用低级流 API.
编写反序列化相比,这仍然非常高效且不易出错
我有一个 json
文件,看起来像这样
{
"races": [
{
"name" : "ORC"
},
{
"name" : "HUMAN"
},
{
"name" : "ELF"
}
],
"npc": [
{
"race" : "HUMAN",
"age" : "25",
"name" : "Jerome"
},
{
"race" : "ORC",
"age" : "26",
"name" : "Rz'Ul"
}
]
}
我想根据需要分别从 races
或 npc
中检索数据。我正在使用 genson
来解析 JSON
。我这样解析
@SuppressWarnings("unchecked")
public static <T> List<T> readJsonList(String listName) {
Genson genson = JsonContext.PARSER.getParser();
List<T> result = null;
try (InputStream is = JsonDataProcessor.class.getResourceAsStream(FILE)) {
ObjectReader reader = genson.createReader(is);
reader.beginObject();
while (reader.hasNext()) {
reader.next();
if ("races".equals(listName) && "races".equals(reader.name())) {
result = (List<T>) processRaceData(reader);
break;
}
if ("npc".equals(listName) && "npc".equals(reader.name())) {
result = (List<T>) processNpcData(reader);
break;
}
}
reader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
例如,解析 races
的方法如下所示
private static List<Race> processRaceData(ObjectReader reader) {
List<Race> raceList = new ArrayList<>();
reader.beginArray();
while (reader.hasNext()) {
reader.next();
Race race = new Race();
reader.beginObject();
while (reader.hasNext()) {
reader.next();
if ("name".equals(reader.name())) { race.setName(reader.valueAsString()); }
else { reader.skipValue(); }
}
reader.endObject();
raceList.add(race);
}
reader.endArray();
return raceList;
}
在调试中 populates
变量 result
很好,但是在 endObject
行我得到异常
Exception in thread "main" com.owlike.genson.stream.JsonStreamException: Illegal character at row 11 and column 4 expected } but read ',' !
at com.owlike.genson.stream.JsonReader.newWrongTokenException(JsonReader.java:942)
at com.owlike.genson.stream.JsonReader.end(JsonReader.java:428)
at com.owlike.genson.stream.JsonReader.endObject(JsonReader.java:177)
at com.lapots.breed.platform.json.JsonDataProcessor.readJsonList(JsonDataProcessor.java:41)
at com.lapots.breed.platform.Example.prepareDb(Example.java:18)
at com.lapots.breed.platform.Example.main(Example.java:23)
有什么问题?
我玩过你的代码,发现 genson 期望在你调用 endObject
时关闭对象并检查 }
符号。您只需要使用 reader.skipValue()
跳过对象。所以错误在 readJsonList
方法中的 while
块中。这段代码应该适合你:
@SuppressWarnings("unchecked")
public static <T> List<T> readJsonList(String listName) {
. . .
while (reader.hasNext()) {
reader.next();
if ("races".equals(listName) && "races".equals(reader.name())) {
result = result = (List<T>) processRaceData(reader);
break;
}
if ("npc".equals(listName) && "npc".equals(reader.name())) {
result = result = (List<T>) processNpcData(reader);
break;
}
reader = reader.skipValue();
}
reader.endObject();
. . .
你为什么不使用 Genson 的数据绑定功能,让它为你做 skipValue 和映射? 您可以定义两个数据结构,一个用于比赛,另一个用于 npc,然后像这样反序列化它们:
class Races {
public List<Race> races;
}
class Npcs {
public List<Npc> npc;
}
// This will skip npc and all the fields in it
Races races = genson.deserialize(inputStream, Races.class);
与使用低级流 API.
编写反序列化相比,这仍然非常高效且不易出错