Swift JSONがModelを回す時xmlリッチテキストに出会う

7242 ワード

最近はSwiftでJSON転モデルで使われている大神たちが書いたサードパーティライブラリを勉強しています.Swiftを使うことを選んだ以上、一番Swiftのライブラリを探して使います.
  • ObjectMapper---Swift言語に基づいて開発されたJSONとObjectの間を容易に変換できるクラスライブラリ.
  • SwityJSON---Swift言語で作成されたオープンソースライブラリは、JSONデータ(解析データ、生成データ)を容易に処理できます.
  • HandyJSON---このライブラリはアリのある大神が発売したもので、JSONがModelを一歩前進させることができる純Swiftライブラリです.

  • これらのライブラリの原理の紹介と詳細な使用の紹介については説明しません.度娘は私より本を読むことが多いです.基本的な運用を簡単に示すだけで、私が使用中に出会った穴です.
    NOTE:ネットワークリクエストはAlamofireで、ついでに自分の小さなパッケージに入れて、返されたリクエストの結果は[String : AnyObject]というフォーマットに直接返されました.デイジーロード用はSwitNoticeでシンプルな純Swift.
    /*
    POST   
    - target: UIViewController         
    - url: url
    - param:   
    - success:     
    - failture:     
    */
    func Request_Post(target: UIViewController,url: String, param: [String: Any], success : @escaping (_ response : [String : AnyObject])->(),failture : @escaping (_ error : Error)->()) {
    
            target.pleaseWait()
            let completeUrl: URL! = NSURL(string: url)! as URL
            Alamofire.request(completeUrl!, method: .post, parameters: param).responseJSON { (response) in
    
                switch response.result{
                case .success:
                    if let value = response.result.value as? [String: AnyObject] {
                        success(value)
                        let json = JSON(value).rawString()
                        print(json)
                        target.clearAllNotice()
                    }
                case .failure(let error):
                    failture(error)
                    target.clearAllNotice()
                    target.errorNotice("    ", autoClear: true)
                }
            }
        }
        
    

    穴はもうすぐ現れるから,皆さんはよく見てください.
    バックグラウンドからのJSONデータフォーマット
    {
    "status": "0",
      "msg": "    ",
      "data": {
        "advertisingList": [
          {
            "advId": "  id1",
            "advContent": "  1",
            "titleMultiUrl": "      ",
          },
          {
            "advId": "  id2",
            "advContent": "  2",
            "titleMultiUrl": "      ",
          }
        ]
      }
    }
    

    Model(用のHandyJSON、書くコードが少ないので)
     struct  HomeBannerModel: HandyJSON {
        var advId: String?
        var advContent: String?
        var titleMultiUrl: String?
    }
    

    要求コード
    YYBaseRequest().Request_Post(target: self, url: "  url", Parameters: ["pageNumber":"1"], success: { (responseData) in
                if(((JSON(responseData)["status"].rawValue) as AnyObject).integerValue == 0){
                   let dataJson = JSON(responseData)["data"]["advertisingList"].rawString()
                    let advertisingModel = JSONDeserializer.deserializeModelArrayFrom(json: dataJson)
    let BannerData = advertisingModel! as! [HomeBannerModel]
    }}){(error) in }
    

    これは全く問題なくスムーズにモデルになり、楽しく使いました.
    BUT
  • 私の開発では、フィールドの1つがxmlリッチテキストフォーマットである場合があります.例えば、バックグラウンドから返されるJSONデータにadvDetailフィールドを追加するxmlリッチテキスト.
    "advDetail":"

    "
  • 対応するHomeBannerModelに対応する変数var advId: String?を追加します.このとき解析するとエラーが報告され,位置はlet advertisingModel =JSONDeserializer.deserializeModelArrayFrom(json: dataJson)でエラーが報告される.
  • JSONデータを印刷し、JSONフォーマット検査ツールでフォーマットが正しくないことを検査します.Paw(Mac上のHTTPクライアントシミュレーションテストツール)でシミュレーションし、戻ってきたJSONチェックフォーマットを、全く問題ないでしょう!
  • 最後にxmlリッチテキストを引き裂いて、翻訳が欠けている場所を追加します.検証に合格した.

  • 結論:xmlリッチテキストの翻訳時にフォーマットが正しくありません.
    特殊符号の前に\をつける.
    ライブラリを交換することはできません.コードが多ければ多いでしょう.自分で実現するより強いです.
    //MARK:- ObjectMapper 
    class HomeBannerModel: Mappable {
    
        var advId: String?
        var advContent: String?
        var titleMultiUrl: String?
    }
    

    データ要求コード
    YYBaseRequest().Request_Post(target: self, url: "  url", Parameters: ["pageNumber":"1"], success: { (responseData) in
     
    let dataJson = JSON(responseData)["data"]["advertisingList"].rawString()
    let advertisingModel = JSONDeserializer.deserializeModelArrayFrom(json: dataJson)
    let BannerData = advertisingModel! as! [HomeBannerModel]
    
    }){(error) in }
    

    このような定番のkey=valueは全く問題なく、スムーズにモデルになって楽しく使いました.
    BUT
  • 私の開発では、フィールドの1つがxmlリッチテキストフォーマットである場合があります.例えば、バックグラウンドから返されるJSONデータにadvDetailフィールドを追加するxmlリッチテキスト.
    "advDetail":"

    "
  • 対応するHomeBannerModelに対応する変数var advId: String?を追加します.このとき解析するとエラーが報告され,位置はlet advertisingModel =JSONDeserializer.deserializeModelArrayFrom(json: dataJson)でエラーが報告される.
  • JSONデータを印刷し、JSONフォーマット検査ツールでフォーマットが正しくないことを検査します.Paw(Mac上のHTTPクライアントシミュレーションテストツール)でシミュレーションし、戻ってきたJSONチェックフォーマットを、全く問題ないでしょう!
  • 最後にxmlリッチテキストを引き裂いて、翻訳が欠けている場所を追加します.検証に合格した.

  • 結論:xmlリッチテキストの翻訳時にフォーマットが正しくありません.
    特殊符号の前に\をつける.
    その後、最も原始的なモデル転送方法で、モデルを作成した後、モデルの属性に値を割り当てることはできません.これで成功できる.しかし、この書き方はObjectMapperとあまり差がないような気がします.では、ObjectMapperで試してみましょう.
    let data = responseData["data"]!["advertisingList"] as! [[String : AnyObject]]
    for dic in data {
        let model = HomeNewsModel()
        model.advId = dic["advId"] as? String
        model.advContent = dic["advContent"] as? String
        model.titleMultiUrl = dic["titleMultiUrl"] as? String
        model.advDetail = dic["advDetail"] as? String
        self.bannerData.append(model)
    }
    

    ライブラリを交換ObjectMapperを交換してみてください.コードが多ければ多いでしょう.自分で実現するよりも時間と労力を節約します.
    ObjectMapperはMappableプロトコルに従い、json内の各keyとmodel属性の対応関係を作成する必要があります.だからObjectMapperを試用するには3歩歩かなければなりません:1.ModelはMappableプロトコルに従います.2.classはrequired initを実現しますか?(map:Map){},struct実装init?(map: Map) {} 3.json内の各keyとmodel属性の対応関係を作成する
    //MARK:- ObjectMapper 
    class HomeBannerModel: Mappable {
    
        var advId: String?
        var advContent: String?
        var titleMultiUrl: String?
        var advDetail: String?
    
        required init?(map: Map) {} 
    
        // Mappable
        func mapping(map: Map) {
            advId           

    データ要求コード
    YYBaseRequest().Request_Post(target: self, url: "  url", Parameters: ["  key":"  value"], success: { (responseData) in
                
    let featureJson = JSON(responseData)["data"]["newsInfoList"].rawString()
    let features = Mapper().mapArray(JSONString: featureJson!)
    
    }){(error) in }
    

    そして成功した!!!すらすらとモデルになって楽しく使いました.
    最后に成功したが、まだ问题を探していないところは、大神のフレームワークに隠されている小さなバグかもしれない.似たような问题に遭遇して解决に成功したい.そして、なぜのパートナーが教えてくれるのか知っている.感谢しきれない!!!