如何解析一个JSON字符串?

时间:2019-02-04 20:57:53

标签: android json kotlin

我有如下所示的字符串:

{"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\"}"}

我从后端获取文本,我需要获取数据。我该怎么办?

更新

我想使用Gson,我创建了如下所示的Pojo类,但是我需要将值作为日期键(如json)中的字符串使用(也许您不了解我)

 data class RequestGameModel (
    @SerializedName("messageType")
    @Expose
    var messageType: Int? = null,

    @SerializedName("data")
    @Expose
    var data: String? = null)

3 个答案:

答案 0 :(得分:1)

如果您已经知道数据的预期结构,则建议使用GSON。您可以在 JSON-Java反序列化的基础部分中找到不错的教程here,其中介绍了如何反序列化JSON字符串。

String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";  

Gson gson = new Gson();  
UserSimple userObject = gson.fromJson(userJson, UserSimple.class); 

对于您的情况,首先请确保您的JSON字符串格式正确。我认为它应该像这样:

{
    "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"
    }
}

因此,根目录中的data键应该是您的模型之一,而不是String。可能的模型映射如下所示(我摆脱了@SerializedName@Expose注释以强调结构):

data class RequestGameModel(
    val `data`: GameModel? = null
)

data class GameModel(
    val methodName: String? = null,
    val arguments: List<GameArguments>? = 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
)

请注意,我使用的是val而不是var,因此请确保已将GSON配置为允许序列化最终字段。

答案 1 :(得分:0)

您可以使用JSONObject

    HBase is not running.org.apache.hadoop.hbase.MasterNotRunningException: java.io.IOException: 
org.apache.zookeeper.KeeperException$ConnectionLossException:
 KeeperErrorCode = ConnectionLoss for /hbase/master

注意:您最有可能从REST API请求JSON,但是如果您可能需要对JSON字符串进行硬编码或只是想使用它,那么Kotlin的原始字符串将变得很方便(以三引号开头和结尾) ),因为那样就不必转义单引号了(就像使用反斜杠一样)。

答案 2 :(得分:0)

一旦有了JSON字符串,您就可以使用GSONjackson之类的外部库为您解析它,或者您可以简单地使用JSONObject来自己做。

JSONObject object = new JSONObject(jsonString)

现在,您可以使用各种方法轻松获取数据。

例如,要获取字符串值:

String value = object.getString("key")

获取布尔值:

boolean value = object.getBoolean("key")

,依此类推。要了解更多信息,请检查here

PS: 请在发布查询之前先对其进行搜索。您很有可能会发现他们已经回答了。 您可以找到已经回答here的内容。