If you already know the expected structure of the data, I recommended using GSON. You can find a pretty good tutorial here, explaining how to deserialize a JSON string in the section Basics of JSON-Java Deserialization.
String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";
Gson gson = new Gson();
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
For your case, first make sure that your JSON string is properly formatted. I think it should look like that:
{
"data": {
"methodName": "matchRequest",
"arguments": [
{
"matchId": 2963,
"gamerName": "pro100_Ocean",
"gamerId": "4c04d9f0-c1e7-410f-8ad8-a95922556bbd",
"gamerFullName": null,
"gamerPhotoUrl": "data\\\\user\\\\4c04d9f0-c1e7-410f-8ad8-a95922556bbd\\\\profile\\\\cropped3649162562321249118.jpg",
"gamerRaiting": 1,
"gamerCardScore": 0,
"correctAnswerScore": 50,
"incorrectAnswerScore": -50,
"isBot": false,
"myCardScore": 0
}
],
"identifier": "00000000-0000-0000-0000-000000000000"
}
}
So the data key in the root should be one of your models instead of a String. A possible model mapping is like following (I got rid of the @SerializedName and @Expose annotations to emphasize the structure):
data class RequestGameModel(
val `data`: GameModel? = null
)
data class GameModel(
val methodName: String? = null,
val arguments: List? = null,
val identifier: String? = null
)
data class GameArguments(
val matchId: Int = -1,
val gamerName: String? = null,
val gamerId: String? = null,
val gamerFullName: String? = null,
val gamerPhotoUrl: String? = null,
val gamerRaiting: Int = 0,
val gamerCardScore: Int = 0,
val correctAnswerScore: Int = 0,
val incorrectAnswerScore: Int = 0,
val isBot: Boolean = false,
val myCardScore: Int = 0
)
Note that I used val and not var, so make sure that you configured GSON to allow serialization of final fields.