Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java toJson()对项目排序错误_Java_Json_Gson - Fatal编程技术网

Java toJson()对项目排序错误

Java toJson()对项目排序错误,java,json,gson,Java,Json,Gson,我有以下输出: { "id": 42950262095, "name": "lol", "players": [ { "avatar": { "userId": 25771876384, "userName": "yhht", "role": "Leader", "level": 40, "league": 0, "trophies": 1011, "d

我有以下输出:

{
  "id": 42950262095,
  "name": "lol",
  "players": [
    {
      "avatar": {
        "userId": 25771876384,
        "userName": "yhht",
        "role": "Leader",
        "level": 40,
        "league": 0,
        "trophies": 1011,
        "donatedTroops": 0,
        "receivedTroops": 0
      }
    },
    {
      "avatar": {
        "userId": 146035414262,
        "userName": "ari",
        "role": "New Member",
        "level": 8,
        "league": 0,
        "trophies": 428,
        "donatedTroops": 0,
        "receivedTroops": 0
      }
    },
    {
      "avatar": {
        "userId": 300659467521,
        "userName": "cp 221",
        "role": "New Member",
        "level": 6,
        "league": 0,
        "trophies": 97,
        "donatedTroops": 0,
        "receivedTroops": 0
      }
    }
  ],
  "badge": 13000049,
  "status": "Anyone Can Join",
  "playerCount": 3,
  "score": 767,
  "requiredTrophies": 0,
  "warsWon": 0,
  "warsLost": 0,
  "warsTied": 0,
  "warFrequency": 0,
  "exp": 0,
  "level": 1,
  "description": "??lol????"
}
但问题是玩家阵列来得太早,并且部分初始细节被忽略了

这是我的代码:

public void parseAvatar() throws IOException, JSONException{

        Game game = new Game();

        game.setId(is.readLong());
        game.setName(is.readString());
        game.setBadge(is.readInt());
        game.setStatus(status(is.readInt()));
        game.setPlayerCount(is.readInt());
        game.setScore(is.readInt());
        game.setRequiredTrophies(is.readInt());
        game.setWarsWon(is.readInt());
        game.setWarsLost(is.readInt());
        game.setWarsTied(is.readInt());
        is.readInt();
        game.setWarFrequency(is.readInt());
        is.readInt();
        game.setExp(is.readInt());
        game.setLevel(is.readInt());
        game.setDescription(is.readString());
        is.readInt();
        boolean a = is.readBoolean();

        if(a){
            is.readInt();
            is.readInt();
        }

        int memCount = is.readInt();
        /// Members!!

        int i = 0;
        while(i < memCount){
            PlayerAvatar avatar = new PlayerAvatar();
            avatar.setUserId(is.readLong());
            avatar.setUserName(is.readString());
            avatar.setRole(role(is.readInt()));
            avatar.setLevel(is.readInt());
            avatar.setLeague(is.readInt());
            avatar.setTrophies(is.readInt());
            avatar.setDonatedTroops(is.readInt());
            avatar.setReceivedTroops(is.readInt());
            is.readInt();
            is.readInt();
            is.readLong();
            is.readByte();
            is.readByte();
            is.readLong();

            GamePlayer player = new GamePlayer();
            player.setAvatar(avatar);
            game.addPlayers(player);
            i++;
        }


        json = new Gson().toJson(game);
        System.out.println();
    }


    private String role(int role) {
        String memberRole = "";

        if(role == 1){
            memberRole = "New Member";
        }   

        if(role == 2){
            memberRole = "Leader";
        }   

        if(role == 3){
            memberRole = "Elder";
        }   

        if(role == 4){
            memberRole = "Co Leader";
        }   

        return memberRole;
    }

    private String status(int statusint) {
        String type = null;
        if(statusint == 1){
            type = "Anyone Can Join";
        }
        if(statusint == 2){
            type = "Invite Only";
        }
        if(statusint == 3){
            type = "Closed";
        }
        return type;
    }
public void parseAvatar()抛出IOException、jsoneexception{
游戏=新游戏();
game.setId(is.readLong());
game.setName(is.readString());
game.setBadge(is.readInt());
game.setStatus(状态(is.readInt());
game.setPlayerCount(is.readInt());
game.setScore(is.readInt());
game.setRequiredTrophies(is.readInt());
game.setWarsWon(is.readInt());
game.setWarsLost(is.readInt());
game.setWarsTied(is.readInt());
is.readInt();
game.setWarFrequency(is.readInt());
is.readInt();
game.setExp(is.readInt());
game.setLevel(is.readInt());
game.setDescription(is.readString());
is.readInt();
布尔a=is.readBoolean();
如果(a){
is.readInt();
is.readInt();
}
int memCount=is.readInt();
///成员!!
int i=0;
而(i

您可以在本文中找到游戏、PlayerAvatar和GamePlayer类的详细信息:


有人知道我如何正确排序吗?

JSON对象根据定义是无序的-您不应该依赖于属性的顺序。所以gson所做的一切都很好

如果出于某种原因,您别无选择,只能依赖于排序,那么这个问题有一些解决方案:(例如,使用jackson而不是gson,使用
@JsonPropertyOrder
,或者实现自定义序列化程序)

对于当前的gson和JDK实现,对类中的成员重新排序将产生相应顺序的输出,但是这是一个非常脆弱的解决方案。比如说

  • JDK不能保证通过反射读取字段的顺序,将来可能会改变(过去已经改变),这会破坏代码。(这实际上是最不可能的问题,但也是可能的)。事实上 返回数组中的元素没有排序,也没有任何特定的顺序

  • 即使JDK的订单没有改变,gson也不能保证它会以相同的顺序返回它们。它目前确实以相同的顺序返回它们,但如果由于某种原因gson的内部发生了更改,例如使用中间
    HashMap
    ,则顺序将发生更改,您的代码将中断
  • 如果将来有其他人在维护您的类,他们会非常惊讶地发现,仅仅对类中的字段重新排序就会破坏代码——java类中字段的排序不应该改变功能
如果您编写代码只是为了自娱自乐,或者使用一次转换某些数据,这可能没什么大不了的,但是如果您编写的代码是其他人(甚至未来的您)需要维护的,我强烈建议您编写的代码不依赖于假设层,和/或持续测试,以确保多个未记录的行为没有改变


现在花几分钟时间合并代码,以确保字段的顺序,可以节省数小时或数天的调试时间。这种情况在现实生活中经常发生。

JSON对象根据定义是无序的-您不应该依赖于属性的顺序。所以gson所做的一切都很好

如果出于某种原因,您别无选择,只能依赖于排序,那么这个问题有一些解决方案:(例如,使用jackson而不是gson,使用
@JsonPropertyOrder
,或者实现自定义序列化程序)

对于当前的gson和JDK实现,对类中的成员重新排序将产生相应顺序的输出,但是这是一个非常脆弱的解决方案。比如说

  • JDK不能保证通过反射读取字段的顺序,将来可能会改变(过去已经改变),这会破坏代码。(这实际上是最不可能的问题,但也是可能的)。事实上 返回数组中的元素没有排序,也没有任何特定的顺序

  • 即使JDK的订单没有改变,gson也不能保证它会以相同的顺序返回它们。它目前确实以相同的顺序返回它们,但如果出于某种原因
    private Long id;
    private String name;
    private List<Player> players;
    
    {
      "id": 171799578198,
      "name": "Forum Striking",
      "players": [
        {
          "avatar": {
            "userId": 21393,
            "currentHomeId": 21393,
            "clanId": 171799578198
          }
        },
        {
          "avatar": {
            "userId": 64425223942,
            "currentHomeId": 64425223942,
            "clanId": 171799578198
          }
        }
      ]
    }
    
    private Long id;
    private List<Player> players;
    private String name;
    
    {
      "id": 171799578198,
      "players": [
        {
          "avatar": {
            "userId": 21393,
            "currentHomeId": 21393,
            "clanId": 171799578198
          }
        },
        {
          "avatar": {
            "userId": 64425223942,
            "currentHomeId": 64425223942,
            "clanId": 171799578198
          }
        }
      ],
      "name": "Forum Striking"
    }