从文件输入的Swift JSON数据和解码

从文件输入的Swift JSON数据和解码,json,swift,user-input,Json,Swift,User Input,我有一个JSON解码器,但有几个问题。首先,我所做的和使用JSONSerialization函数有什么区别 我的下一个问题是关于文件和JSON的。如何让一个用户定义的文件通过管道传输到我的程序中,以便对其JSON数据进行解码。我假设我的文件在捆绑包中,因此是第二行代码,但我不确定从这里到哪里去 let input = readLine() let url = Bundle.main.url(forResource: input, withExtension: "json")! struct

我有一个JSON解码器,但有几个问题。首先,我所做的和使用JSONSerialization函数有什么区别

我的下一个问题是关于文件和JSON的。如何让一个用户定义的文件通过管道传输到我的程序中,以便对其JSON数据进行解码。我假设我的文件在捆绑包中,因此是第二行代码,但我不确定从这里到哪里去

let input = readLine()
let url = Bundle.main.url(forResource: input, withExtension: "json")!


struct jsonStruct: Decodable {
    let value1: String
    let value2: String
}


// JSON Example
let jsonString = """
{
"value1": "contents in value 1",
"value2": "contents in value 2"
}
"""

// Decoder
let jsonData = url.data(using: .utf8)!//doesn't work, but works if 'url' is changed to 'jsonString'
let decoder = JSONDecoder()
let data = try! decoder.decode(jsonStruct.self, from: jsonData)
print(data.value1)
print(data.value2)
Codable基于JSONSerialization,提供了一种方便的方式,可以直接从结构/类中对JSON进行en/解码

URL只是指向某个位置的指针。您必须以给定的URL从文件加载数据

请用大写字母开头命名结构

struct JsonStruct: Decodable {
    let value1: String
    let value2: String
}

let url = Bundle.main.url(forResource: input, withExtension: "json")!
do {
    let jsonData = try Data(contentsOf: url)
    let decoder = JSONDecoder()
    // the name data is misleading
    let myStruct = try decoder.decode(JsonStruct.self, from: jsonData)
    print(myStruct.value1)
    print(myStruct.value2)

} catch { print(error) }
Codable基于JSONSerialization,提供了一种方便的方式,可以直接从结构/类中对JSON进行en/解码

URL只是指向某个位置的指针。您必须以给定的URL从文件加载数据

请用大写字母开头命名结构

struct JsonStruct: Decodable {
    let value1: String
    let value2: String
}

let url = Bundle.main.url(forResource: input, withExtension: "json")!
do {
    let jsonData = try Data(contentsOf: url)
    let decoder = JSONDecoder()
    // the name data is misleading
    let myStruct = try decoder.decode(JsonStruct.self, from: jsonData)
    print(myStruct.value1)
    print(myStruct.value2)

} catch { print(error) }
可编码和NSJSONSerialization之间的区别?代码更少,因为键更容易内部解释。通常,您需要使用NSJSONSerialization:let value1=jsonDict[value1],这里不需要它。url.datausing:.utf8!,这是将作为路径/url的url转换为不读取url/Path url处内容的NSData。这就是它失败的原因。这就像将字符串转换为NSData,而不是从该URL获取内容?代码更少,因为键更容易内部解释。通常,您需要使用NSJSONSerialization:let value1=jsonDict[value1],这里不需要它。url.datausing:.utf8!,这是将作为路径/url的url转换为不读取url/Path url处内容的NSData。这就是它失败的原因。这就像将字符串转换为NSData,而不是从该URL获取内容。