我达到了接近问题要求的东西:
我用的是杰克逊的对象识别特征 http://wiki.fasterxml.com/JacksonFeatureObjectIdentity它允许定义某个属性的值来标识 POJO 的不同实例:
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,
property="name", scope=Player.class)
public class Player
{
public String name;
public Player() {}
public Player(String name) { this.name = name; }
public String toString() {
// prints name and java object id
return name + "-" + super.toString();
}
}
这是使用的 POJO 的其余部分:
public class League
{
public List<Player> players;
public List<Team> teams;
}
public class Team
{
public String name;
public List<Player> players;
public Team() {}
public Team(String name) { this.name = name; }
public String toString() {
return name + "-" + super.toString() + ":" + players.toString();
}
}
测试方法:
public static void main(String[] args)
{
ObjectMapper objectMapper = new ObjectMapper();
try (Reader reader = new FileReader("C:/Temp/xx.json")) {
League l = objectMapper.readValue(reader, League.class);
System.out.println("l.players");
System.out.println(l.players);
System.out.println("l.teams");
System.out.println(l.teams);
} catch (Exception e) {
e.printStackTrace();
}
}
输出清楚地表明玩家和团队中使用了相同的对象:
l.players
[Player 1-test.JSONTest$Player@641147d0, Player 2-test.JSONTest$Player@6e38921c, Player 3-test.JSONTest$Player@64d7f7e0, Player 4-test.JSONTest$Player@27c6e487, Player 5-test.JSONTest$Player@49070868, Player 6-test.JSONTest$Player@6385cb26, Player 7-test.JSONTest$Player@38364841, Player 8-test.JSONTest$Player@28c4711c]
l.teams
[Team 1-test.JSONTest$Team@59717824:[Player 1-test.JSONTest$Player@641147d0, Player 2-test.JSONTest$Player@6e38921c], Team 2-test.JSONTest$Team@146044d7:[Player 3-test.JSONTest$Player@64d7f7e0, Player 4-test.JSONTest$Player@27c6e487], Team 3-test.JSONTest$Team@1e9e725a:[Player 5-test.JSONTest$Player@49070868, Player 6-test.JSONTest$Player@6385cb26], Team 4-test.JSONTest$Team@15d9bc04:[Player 7-test.JSONTest$Player@38364841, Player 8-test.JSONTest$Player@28c4711c]]
到目前为止一切都很好,那么为什么要“接近要求”呢?
我必须稍微更改输入 json,以便 Jackson 能够正确识别团队中的球员是对球员列表中球员的引用:
{
"players": [
{ "name": "Player 1" },
{ "name": "Player 2" },
{ "name": "Player 3" },
{ "name": "Player 4" },
{ "name": "Player 5" },
{ "name": "Player 6" },
{ "name": "Player 7" },
{ "name": "Player 8" }
],
"teams": [
{
"name": "Team 1",
"players": [ "Player 1", "Player 2"]
},
{
"name": "Team 2",
"players": [ "Player 3", "Player 4"]
},
{
"name": "Team 3",
"players": [ "Player 5", "Player 6"]
},
{
"name": "Team 4",
"players": [ "Player 7", "Player 8"]
}
]
}