检查 Jsonobject 是不是为 Int

Posted

技术标签:

【中文标题】检查 Jsonobject 是不是为 Int【英文标题】:Check Jsonobject for Int检查 Jsonobject 是否为 Int 【发布时间】:2018-01-10 00:14:34 【问题描述】:

我有一个问题,我得到了一个 Json。数据来自字典。

这是一个示例 json:

Receivedtext: 
  "x": "pricef",
  "b": "usd",
  "ds": [
    "tpr",
    "avgp",
    "mcap",
    "ppc7D",
    "ppc12h",
    "ppc4h",
    "ppc24h"
  ],
  "data": [
    [
      "ADA/USD",
      "0.819",
      "21.23B",
      "6.09",
      "-5.45",
      "-5.36",
      "-10"
    ],
    [
      "AVT/USD",
      "5.968",
      "35.81M",
      "24.33",
      "-4.51",
      "-3.3",
      "6.65"
    ],
    [
      "BAT/USD",
      "0.946",
      "unknown",
      null,
      null,
      null,
      null
    ],  [
      "FUN/USD",
      "0.000",
      "0.00",
      0,
      0,
      0,
      0
    ] ]

通常json应该都是String。我可以处理 nill/null 但我不知道如何处理它的 Int/Double。

如果它是 Int/Double 我想用“未知”替换该值。

这是我目前的代码:

struct JsonMaintableWebsocket 
    let tpr: String?
    let avgp: String?
    let mcap: String?
    let ppc7D: String?
    let ppc12h: String?
    let ppc4h: String?
    let ppc24h: String?


    init(json: [String?]) 
        self.tpr = json[0]
        self.avgp = json[1]
        self.mcap = json[2]
        self.ppc7D = json[3]
        self.ppc12h = json[4]
        self.ppc4h = json[5]
        self.ppc24h = json[6]
    

    static func fetchJsonWebsocketMaintable(json: Data) -> [JsonMaintableWebsocket] 
        var jsonWebsocket: [JsonMaintableWebsocket] = []
        do 
            let jsonData = try JSONSerialization.jsonObject(with: json, options: []) as? [String: Any?]
            if let data = jsonData!["data"] as? [[String?]] 
                for d in data  
                    jsonWebsocket.append(JsonMaintableWebsocket(json: d))
                
            
        
        catch let error
            print(error.localizedDescription)
        
        return jsonWebsocket
    

非常感谢!

【问题讨论】:

tpr? avgp?你希望别人如何阅读你的代码?/ 请尝试改进您的问题:***.com/help/mcve 抱歉,怎样才能更好地阅读?这些是我想从 json 中获取的变量 【参考方案1】:

您可以处理此问题的一种方法是通过数组map 并检查存储的值类型,并采取相应措施。您可以更改这部分:

if let data = jsonData!["data"] as? [[String?]] 
  for d in data  
    jsonWebsocket.append(JsonMaintableWebsocket(json: d))
  

到这里:

if let data = jsonData!["data"] as? [[Any?]] 
  for d in data  
    let adjustedArray: [String?] = d.map(
      //First, check to see if object is nil, and return nil if so
      if $0 == nil 
        return nil

      //Check to see if value is string, and return string
       else if let stringValue = $0 as? String 
        return stringValue

      //Otherwise return "unknown"
       else 
        return "unknown"
      
    )
    jsonWebsocket.append(JsonMaintableWebsocket(json: adjustedArray))
  

通过添加更多选项,也可以轻松地将 IntDouble 处理为字符串:

if let data = jsonData!["data"] as? [[Any?]] 
  for d in data  
    let adjustedArray: [String?] = d.map(
      if $0 == nil 
        return nil
       else if let stringValue = $0 as? String 
        return stringValue
       else if let intValue = $0 as? Int 
        return "\(intValue)"
       else if let doubleValue = $0 as? Double 
        return "\(doubleValue)"
       else 
        return "unknown"
      
    )
    jsonWebsocket.append(JsonMaintableWebsocket(json: adjustedArray))
  

【讨论】:

如果这解决了您的问题,请将此答案标记为解决方案,以便其他人知道问题已解决。

以上是关于检查 Jsonobject 是不是为 Int的主要内容,如果未能解决你的问题,请参考以下文章

如何在获取值之前对JSONObject中的每个元素进行空检查?

解析为对象而不是数组时出现Json错误:JSONObject中的getJSONObject(java.lang.String)无法应用于(int)

java JsonObject怎么判断一个json串中是不是含有某个key值????

java.lang.String 无法从 Android 转换为 JSONObject

如何判断jsonobject是不是存在某个字段

如何使用 ResponseEntity 返回 JSONObject 而不是 HashMap? (未找到类型返回值的转换器:类 org.json.JSONObject)