简体   繁体   中英

Writing JSON file programmatically swift

im making quiz app and I want to download questions from server in JSON file, parse it and make question object that I will present. I did it so now I want to make an app that will be creating JSON file and upload it to the server, I want to it looks like this
在此处输入图片说明

I will get all information from text fields and save it in JSON file like this(with oder values)

    [
{
    "question":"If you want to create a custom class which can be displayed on the view, you can subclass UIView.",
    "answers":["True", "False"],
    "correctIndex":0,
    "module":3,
    "lesson":0,
    "feedback":"Subclassing UIView gives your class the methods and properties of a basic view which can be placed onto the view."
}
 ]

Is in swift any framework with function that can I use? Or I have to make it manually? If manually how can I save JSON file?

You can use JSONSerialization class for this purpose. Please see the code snippet below cooked up in Playground

import Foundation

// Dictionary containing data as provided in your question.
var dictonary : [String : Any] = ["question":"If you want to create a custom class which can be displayed on the view, you can subclass UIView.",
                                  "answers":["True", "False"],
                                  "correctIndex":0,
                                  "module":3,
                                  "lesson":0,
                                  "feedback":"Subclassing UIView gives your class the methods and properties of a basic view which can be placed onto the view."
                                 ]


if let jsonData = try JSONSerialization.data(withJSONObject: dictonary, options: .init(rawValue: 0)) as? Data
{
    // Check if everything went well
    print(NSString(data: jsonData, encoding: 1)!)

    // Do something cool with the new JSON data
}

If you run this code in Xcode playground, you can see your data printed in JSON format Once you have the JSON , you can use the networking library of your choice to send the data over to the server.

Swift 3/4

Save Json data in local file

func saveUploadedFilesSet(fileName:[String : Any]) {
        let file: FileHandle? = FileHandle(forWritingAtPath: "\(fileName).json")

        if file != nil {
            // Set the data we want to write
            do{
                if let jsonData = try JSONSerialization.data(withJSONObject: fileName, options: .init(rawValue: 0)) as? Data
                {
                    // Check if everything went well
                    print(NSString(data: jsonData, encoding: 1)!)
                    file?.write(jsonData)

                    // Do something cool with the new JSON data
                }
            }
            catch {

            }
            // Write it to the file

            // Close the file
            file?.closeFile()
        }
        else {
            print("Ooops! Something went wrong!")
        }
    }

Swift 3/4 Retrive json data from local file

func getUploadedFileSet(filename:String) {
    if let path = Bundle.main.path(forResource: "assets/\(filename)", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
            let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
            if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let person = jsonResult["person"] as? [Any] {
                // do stuff
            }
        } catch let error {
            print("parse error: \(error.localizedDescription)")
        }
    } else {
        print("Invalid filename/path.")
    }
}

else you can convert [String:Any] Object to json

import Foundation

// Dictionary containing data as provided in your question.
var dictonary : [String : Any] = ["question":"If you want to create a custom class which can be displayed on the view, you can subclass UIView.",
                                  "answers":["True", "False"],
                                  "correctIndex":0,
                                  "module":3,
                                  "lesson":0,
                                  "feedback":"Subclassing UIView gives your class the methods and properties of a basic view which can be placed onto the view."
                                 ]


if let jsonData = try JSONSerialization.data(withJSONObject: dictonary, options: .init(rawValue: 0)) as? Data
{
    // Check if everything went well
    print(NSString(data: jsonData, encoding: 1)!)

    // Do something cool with the new JSON data
}

Try this Playground file

Swift 3

let jsonString = "[" +
    "{" +
    "    \"question\":\"If you want to create a custom class which can be displayed on the view, you can subclass UIView.\"," +
    "    \"answers\":[\"True\", \"False\"]," +
    "    \"correctIndex\":0," +
    "    \"module\":3," +
    "    \"lesson\":0," +
    "    \"feedback\":\"Subclassing UIView gives your class the methods and properties of a basic view which can be placed onto the view.\"" +
    "}" +
" ]"


// convert String to NSData
let dataFromString: Data? = jsonString.data(using: String.Encoding.utf8)


guard let data = dataFromString else {
    print("Error")
    return
}

do {
    let parsedData = try JSONSerialization.jsonObject(with: data, options: []) as! [[String:Any]]
} catch let error {
    print(error)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM