Ecrire dans un fichier JSON local

Bonjour tous le mondes et bonne fête a vous de noël,


 


Je vous sollicite pour une question je cherche a écrire dans un fichier JSON local.


Les informations json son récupérer avec Alamofire et je les écris dans un fichier JSON.


 


pour cela je fait cette manipe mais j'ai toujours une erreur de ce type :



Value of type '[[String : AnyObject]]' has no member 'write'

mon code :



func loadListOfJson() {
Alamofire.request("http://serveur/api/json_list.php")
.validate()
.responseJSON { (response) in
if response.result.isSuccess {
self._personList = response.result.value as! [[String : AnyObject]]
print("List:", self._personList)

let pathToFile = Bundle.main.path(forResource: "text", ofType: "json")
print(pathToFile!)// là  j'ai mon fichier json qui apparais dans le console.

erreur est là  ---> self._personList.write(to: pathToFile, atomically: false, encoding: String.Encoding.utf8)

// je récupérer mon JSON et l'écris dans mon fichier text.json

//Et là  je lie mon fichier test.json
if let path = pathToFile {
// Load the file contents as a string.
let agencesString = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)

// Append the countries from the string to the dataArray array by breaking them using the line change character.
self.dataArray = agencesString.components(separatedBy: "\n")

// Reload the tableview.
self.tblSearchResults.reloadData()
}

} else {
print(response.result.error!)
}
}
}


Merci de votre aide,


 


 


Réponses

  • CéroceCéroce Membre, Modérateur
    décembre 2016 modifié #2
    1) Déjà  on ne peut pas écrire dans le Bundle de l'appli. (à  vrai dire, ça marche sur le simu, mais pas en vrai sur le terminal)
    Enregistre-le dans le répertoire Documents de la sandbox de l'appli:
    FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    2) String: AnyObject est un Array de dictionnaires. Or Array ne possède pas de méthode write(), mais NSArray, si. D'après l'exemple donné dans la doc d'Array:
    (self.personList as NSArray).write(to: pathToFile, atomically: true, encoding: .utf8)
    Je n'ai pas testé, et je crains que tu doives aussi convertir [String: AnyObject] en NSDictionary.
  • Merci a toi je vais modifier mes erreur


  • Bonsoir et bonne année a tous le monde et encore merci de votre aide et conseille.


     


    Mon problème et que j'arrive a écrire le json dans un fichier texte local, je voudrais que cela ressemble a ça


     


    Il ressemble a cela après write :



    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <array>
    <dict>
    <key>nom</key>
    <string>toto</string>
    <key>code</key>
    <string>1</string>
    </dict>
    <dict>
    <key>nom</key>
    <string>tata</string>
    <key>code</key>
    <string>33</string>
    </dict>
    </array>
    </plist>


    mais je voudrai que cela ressemble a  ça dans mon fichier :



    toto 1
    tata 33

    Je n'y arrive pas.


     


    merci de votre aide.



  • toto 1

    tata  33




    Cela ne ressemble à  aucun format.


     


    Le format que tu as, c'est normal car tu as utiliser le write d'un NSArray (ou d'un NSDictionary donnera un résultat du même type) et a donc écrit un .plist


    Si c'est uniquement pour ton application, tu n'as aucun problème, tu peux lire le plist directement (contentsOfFile:).


    Si tu veux "écrire réellement du JSON", il faut utiliser sa représentation en String. Auquel cas, tu dois passer par NSJSONSerialization (qui transformera ton array/dictionary en NSData, puis tu le passer en String).


     


    Mais c'est pas clair ce que tu veux réellement.


  • Bonjour,


     


    je vous explique je récupérer du json que je copie dans un fichier .json local, l'utilise pour faire des recherches, cela doit ressembler a du texte.


     


    je n'arrive pas a trier ce format .plist, pour écrire que du texte sans les array, key comment faire et ne garder que les string.


    Le résultat que je veux dans mon fichier texte.


     


    Voilà  pour quoi je cherche cela.


     


    Merci de votre aide,

  • Ok.

    Donc en réalité, tu ne sauvegardes pas du JSON réellement. Tu veux sauvegarder une sorte de string parsé à  partir de JSON.


    Il faut donc faire ton parsing comme tu l'entends. Sachant que tu sembles perdre toutes les clés des dictionnaires et garder uniquement leurs values, tu dois pouvoir utiliser en Swift map ou flatmap (mais je laisserais les dév' en Swift te conseiller mieux), ou alors le faire à  la main en itérant le tout.


  • Peut-tu m'aider je n'y arrive pas o:) .


     


    voilà  mon code :



    import UIKit
    import Alamofire

    class SearchTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate, SearchDetailsViewControllerDelegate {

    @IBOutlet weak var menuButton:UIBarButtonItem!
    @IBOutlet weak var tblSearchResults: UITableView!

    var dataArray = [String]()
    var filteredArray = [String]()
    var shouldShowSearchResults = false
    var searchController: UISearchController!
    var searchDetailsViewController: SearchDetailsViewController!
    var newsTableViewCell: NewsTableViewCell!
    var _personList:[String] = []
    var _personList1:[[String:AnyObject]] = []

    override func viewDidLoad() {
    super.viewDidLoad()

    if revealViewController() != nil {
    menuButton.target = revealViewController()
    menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }

    tblSearchResults.delegate = self
    tblSearchResults.dataSource = self

    loadListOfJson()

    configureSearchTableViewCell()
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
    return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if shouldShowSearchResults {
    return filteredArray.count
    }
    else {
    return dataArray.count
    }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "idCell", for: indexPath)

    if shouldShowSearchResults {
    cell.textLabel?.text = filteredArray[indexPath.row]
    }
    else {
    cell.textLabel?.text = dataArray[indexPath.row]
    }

    return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 60.0
    }

    func configureSearchController() {

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search here..."
    searchController.searchBar.delegate = self
    searchController.searchBar.sizeToFit()

    tblSearchResults.tableHeaderView = searchController.searchBar
    }

    func configureSearchTableViewCell() {
    searchDetailsViewController = SearchDetailsViewController(searchResultsController: self, searchBarFrame: CGRect(x: 0.0, y: 0.0, width: tblSearchResults.frame.size.width, height: 50.0), searchBarFont: UIFont(name: "Futura", size: 16.0)!, searchBarTextColor: UIColor.white, searchBarTintColor: UIColor.red)
    searchDetailsViewController.searchTableViewCell.placeholder = "Search in..."
    tblSearchResults.tableHeaderView = searchDetailsViewController.searchTableViewCell

    searchDetailsViewController.searchDetailsDelegate = self
    }

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    shouldShowSearchResults = true
    tblSearchResults.reloadData()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    shouldShowSearchResults = false
    tblSearchResults.reloadData()
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    if !shouldShowSearchResults {
    shouldShowSearchResults = true
    tblSearchResults.reloadData()
    }

    searchController.searchBar.resignFirstResponder()
    }

    func updateSearchResults(for searchController: UISearchController) {
    guard let searchString = searchController.searchBar.text else {
    return
    }

    filteredArray = dataArray.filter({ (country) -> Bool in
    let agencesText:NSString = country as NSString

    return (agencesText.range(of: searchString, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound
    })

    tblSearchResults.reloadData()
    }

    func didStartSearching() {
    shouldShowSearchResults = true
    tblSearchResults.reloadData()
    }

    func didTapOnSearchButton() {
    if !shouldShowSearchResults {
    shouldShowSearchResults = true
    tblSearchResults.reloadData()
    }
    }

    func didTapOnCancelButton() {
    shouldShowSearchResults = false
    tblSearchResults.reloadData()
    }

    func didChangeSearchText(_ searchText: String) {

    filteredArray = dataArray.filter({ (country) -> Bool in
    let agencesText: NSString = country as NSString

    return (agencesText.range(of: searchText, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound
    })

    tblSearchResults.reloadData()
    }

    func loadListOfJson() {
    Alamofire.request("http://serveur/api/json_list_codepostal_nom_ville.php")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {

    self._personList1 = response.result.value as! [[String:AnyObject]]
    print("List:", self._personList1)

    let pathToFile1 = Bundle.main.path(forResource: "agences", ofType: "json")

    let personList12 = self._personList1 as NSArray
    print(personList12)

    personList12.write(toFile: pathToFile1!, atomically:true);

    let pathToFile = Bundle.main.path(forResource: "agences", ofType: "json")
    print(pathToFile!)

    if let path = pathToFile1 {

    let agencesString = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
    print(agencesString)

    self.dataArray = agencesString.components(separatedBy: "\t")
    print(self.dataArray)

    self.tblSearchResults.reloadData()

    }

    } else {
    print(response.result.error!)
    }
    }
    }
    }

    Merci de ton aide, je suis perdu.


  • InsouInsou Membre
    janvier 2017 modifié #9

    Pour écrire/lire dans un fichier JSON local, j'utilise SwiftyJSON


     


    Mon code :



    import SwiftyJSON

    ...

    // pour écrire dans le fichier JSON
    func writeJSON(){
    if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
    let pathString = path + "/fichierconfig.json" // converti en String
    let checkValidation = FileManager.default // instancie le file manager
    //print(pathString)

    if(!checkValidation.fileExists(atPath: pathString)){ // Check si le fichier n'existe pas
    // On créer le fichier
    let jsonConfiguration = "{\"MaCle\":\"\",\"Ma2emeCle\":\"\",\"Ma3emeCle\":\"\"}" // Clé + valeur vide
    // writing
    do {
    try jsonConfiguration.write(toFile: pathString, atomically: false, encoding: String.Encoding.utf8)
    }
    catch {/* error handling here */}
    }
    }
    }

    // Pour lire le fichier JSON
    func readJSON(){
    // On charge les données via le fichier
    do {
    let pathString = path + "/fichierconfig.json" // converti en String
    let fileUrl = NSURL(fileURLWithPath: pathString) // Convertit un string en NSURL
    let donnéesConfiguration = try NSString(contentsOf: fileUrl as URL, encoding: String.Encoding.utf8.rawValue) // ouvre le fichier
    //print(donnéesConfiguration)
    if let dataFromString = donnéesConfiguration.data(using: String.Encoding.utf8.rawValue, allowLossyConversion: false) { // lit les données
    let jsonConfiguration = JSON(data: dataFromString) // initialise swifty avec une chaine String
    print(jsonConfiguration["MaCle"].stringValue) // affiche la valeur de la clé
    }
    }
    catch {/* error handling here */}
    }

  • Merci de votre aide, j'ai résolut mon problème.


Connectez-vous ou Inscrivez-vous pour répondre.