代码之家  ›  专栏  ›  技术社区  ›  smatthewenglish

将2dpojo数组序列化为json,在java中,在android上

  •  2
  • smatthewenglish  · 技术社区  · 7 年前

    我正在做一个象棋游戏,我想序列化棋盘,并在每次移动后发送到服务器。我将使用JSON来完成这个任务。

    我的游戏被表示为我创建的自定义POJO的二维数组 Piece .

    目前我正在创建一个JSON-ISH字符串,而不是实际的JSON,这是个问题,因为现在我不能像真正的JSON那样对待它,索引它,等等。

    下面是我用来创建这个JSON-ish构造的代码:

    StringBuilder result = new StringBuilder();
    for (int i = 0; i < piecesMatrix.length; i++) {
        result.append("\"row " + i + "\":\n");
        for (int j = 0; j < piecesMatrix[i].length; j ++) {
            result.append("\"column " + j + "\": ");
            if (piecesMatrix[i][j] == null || piecesMatrix[i][j] instanceof LegalMove) {
                result.append(" \"null\",\n");
            } else {
                result.append(" \"" + piecesMatrix[i][j].getClass().getSimpleName() + "\",\n");
            }
        }
    }
    message = result.toString();
    

    结果呈现如下:

    [ 10-06 20:35:19.971  7509: 7509 D/Data = 
    
     ]
    "row 0":
    "column 0":  "BlackRook",
    "column 1":  "BlackKnight",
    "column 2":  "BlackBishop",
    "column 3":  "BlackQueen",
    "column 4":  "BlackKing",
    "column 5":  "BlackBishop",
    "column 6":  "BlackKnight",
    "column 7":  "BlackRook",
    "row 1":
    "column 0":  "BlackPawn",
    "column 1":  "BlackPawn",
    "column 2":  "BlackPawn",
    "column 3":  "BlackPawn",
    "column 4":  "BlackPawn",
    "column 5":  "BlackPawn",
    "column 6":  "BlackPawn",
    "column 7":  "BlackPawn",
    "row 2":
    "column 0":  "null",
    "column 1":  "null",
    "column 2":  "null",
    "column 3":  "null",
    "column 4":  "null",
    "column 5":  "null",
    "column 6":  "null",
    "column 7":  "null",
    "row 3":
    "column 0":  "null",
    "column 1":  "null",
    "column 2":  "null",
    "column 3":  "null",
    "column 4":  "null",
    "column 5":  "null",
    "column 6":  "null",
    "column 7":  "null",
    "row 4":
    "column 0":  "null",
    "column 1":  "WhitePawn",
    "column 2":  "null",
    "column 3":  "null",
    "column 4":  "null",
    "column 5":  "null",
    "column 6":  "null",
    "column 7":  "null",
    "row 5":
    "column 0":  "null",
    "column 1":  "null",
    "column 2":  "null",
    "column 3":  "null",
    "column 4":  "null",
    "column 5":  "null",
    "column 6":  "null",
    "column 7":  "null",
    "row 6":
    "column 0":  "WhitePawn",
    "column 1":  "null",
    "column 2":  "WhitePawn",
    "column 3":  "WhitePawn",
    "column 4":  "WhitePawn",
    "column 5":  "WhitePawn",
    "column 6":  "WhitePawn",
    "column 7":  "WhitePawn",
    "row 7":
    "column 0":  "WhiteRook",
    "column 1":  "WhiteKnight",
    "column 2":  "WhiteBishop",
    "column 3":  "WhiteQueen",
    "column 4":  "WhiteKing",
    "column 5":  "WhiteBishop",
    "column 6":  "WhiteKnight",
    "column 7":  "WhiteRook",
    

    问题是,我如何将其转换为真正的JSON?

    理想情况下,我希望输出如下:

    "row 0":
        "column 0": "Rook",
        "column 1": "Knight",
        "column 2": "Bishop",
        ...,
    "row 1":
        "column 0": "Pawn",
        "column 1": "null",
        "column 2": "Pawn",
        ...,
    "row 2":
        "column 0": "null",
        "column 1": "Pawn",
        "column 2": "null",
        ...
    

    编辑:

    我试过:

    Gson gson = new 
    GsonBuilder().setPrettyPrinting().serializeNulls().create();
        message = gson.toJson(piecesMatrix);
    

    我得到:

    SecurityException: Can not make a java.lang.reflect.Method constructor accessible


    编辑II

    我试过:

    Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
        message = gson.toJson(piecesMatrix, Piece.class);
    

    我得到:

        [ 10-07 00:28:20.591 10899:10899 D/Data = 
    
     ]
    {}
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   smatthewenglish    7 年前

    是这样的吗。。。

            JSONArray arr = new JSONArray();
        for (int i = 0; i < piecesMatrix.length; i++) {
            JSONArray innerArray = new JSONArray();
    
            for (int j = 0; j < piecesMatrix[i].length; j++) {
                JSONObject column = new JSONObject();
    
                if (piecesMatrix[i][j] == null || piecesMatrix[i][j] instanceof LegalMove) {
                    try {
                        column.put("column " + String.valueOf(j), null);
                    } catch (Exception e) {}
                } else {
                    try {
                        column.put("column " + String.valueOf(j), piecesMatrix[i][j].getClass().getSimpleName());
                    } catch (Exception e) {}
                }
                innerArray.put(column);
            }
            JSONObject json = new JSONObject();
            try {
                json.put("row " + i, innerArray);
            } catch (JSONException e) {}
            arr.put(json);
        }
    
        Log.d("Data = \n\n", arr.toString());