【问题标题】:process part of json file处理部分json文件
【发布时间】:2017-12-15 08:44:25
【问题描述】:

我有一个看起来像这样的json 文件

{
  "races": [
    {
      "name"  : "ORC"
    },
    {
      "name"  : "HUMAN"
    },
    {
      "name"  : "ELF"
    }
  ],
  "npc": [
    {
      "race"  : "HUMAN",
      "age"   : "25",
      "name"  : "Jerome"
    },
    {
      "race"  : "ORC",
      "age"   : "26",
      "name"  : "Rz'Ul"
    }
  ]
}

我想根据需要分别从racesnpc 检索数据。我正在使用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)

有什么问题?

【问题讨论】:

  • JsonContext + JsonDataProcessor 类从何而来?
  • @hammerfest JsonContext 是一个枚举,它返回 Genson 的实例,而 JsonDataProcessor 是包含问题代码中的方法的类。

标签: java genson


【解决方案1】:

我玩过您的代码,发现 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();
 . . .

【讨论】:

  • 好吧,它仅适用于单个条目races。它在第一次迭代后结束循环。我想我应该更多地调查genson
  • @user1432980 我认为这就是你想要的。在 JSON 的同一层次结构级别中不能有多个 races 条目。这将不是有效的 JSON 文件。我没有回答你的问题吗?
  • 是的,确实,我在使用 process 方法时遇到了一些问题,因此它仅为 race 条目而不是其他条目填充数据,因为我修复了它,它按预期成功处理了 json。
【解决方案2】:

您为什么不使用 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 编写反序列化相比,这仍然非常有效且不易出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多