Как я могу разобрать локальный файл JSON в ListView в SwiftUI? Новое в разработке приложений здесь - PullRequest
0 голосов
/ 29 апреля 2020

Я не могу разобрать мой локальный файл JSON, который я создал для простой идеи приложения в SwiftUI, и я новичок в разработке приложений. Я попробовал несколько методов, но это не сработало. Попытка выяснить все, что мне не хватает при разборе и сделать это в ListView. Что я хочу сделать, это проанализировать язык и предложение, и в этом случае предложение в моих 3 объектах содержит различное количество предложений, которые я хочу проанализировать, например, предложение1, предложение1b и т. Д. c. (Изменить: показаны две разные ошибки кода и фрагмент Json)

  1. JSON Фрагмент файла
[
    {
    "name": "English",
    "id": 1,
    "sentence": {
        "sentence1": "I eat the apple",
        "sentence2": "It is John's apple",
        "sentence3": "I give John the apple",
        "sentence4": "We give him the apple",
        "sentence5": "He gives it to John",
        "sentence6": "She gives it to him",
        "sentence7": "Is the apple red?",
        "sentence8": "The apples are red",
        "sentence9": "I must give it to him",
        "sentence10": "I want to give it to her",
        "sentence11": "I'm going to know tomorrow",
        "sentence12": "I can't eat the apple"
    }
},
{
    "name": "Mandarin",
    "id": 2,
    "sentence": {
        "sentence1": "我吃的苹果",
        "sentence1a": "我吃的蘋果",
        "sentence1b": "Wǒ chī de píngguǒ",
        "sentence2": "之是约翰的苹果",
        "sentence2a": "之是約翰的蘋果",
        "sentence2b": "Zhī shì Yuēhàn de píngguǒ",
        "sentence3": "我给约翰的苹果",
        "sentence3a": "我給約翰的蘋果",
        "sentence3b": "Wǒ gěi Yuēhàn de píngguǒ",
        "sentence4": "我们给约翰的苹果",
        "sentence4a": "我們給約翰的蘋果",
        "sentence4b": "Wǒ men gěi Yuēhàn de píngguǒ",
        "sentence5": "他把它交给约翰",
        "sentence5a": "他把它交給約翰",
        "sentence5b": "Tā bǎ tā jiāo gěi Yuēhàn",
        "sentence6": "她给了它",
        "sentence6a": "她給了它",
        "sentence6b": "Tā gěi le tā",
        "sentence7": "苹果是红色的吗?",
        "sentence7a": "蘋果是紅色的嗎?",
        "sentence7b": "Píngguǒ shì hóngsè de ma?",
        "sentence8": "苹果是红色的",
        "sentence8a": "苹果是红色的",
        "sentence8b": "Píngguǒ shì hóngsè de",
        "sentence9": "我必须给他",
        "sentence9a": "我必須給他",
        "sentence9b": "Wǒ bìxū gěi tā",
        "sentence10": "我想给他",
        "sentence10a": "我想給他",
        "sentence10b": "Wǒ xiǎng gěi tā",
        "sentence11": "我明天要知道",
        "sentence11a": "我明天要知道",
        "sentence11b": "Wǒ míngtiān yào zhīdào",
        "sentence12": "我不吃的苹果",
        "sentence12a": "我不吃的蘋果",
        "sentence12b": "Wǒ bù chī de píngguǒ"
    }
},
{
    "name": "French",
    "id": 3,
    "sentence": {
        "sentence1": "Je mange la pomme",
        "sentence2": "C’est la pomme de John",
        "sentence3": "Je donne la pomme à John",
        "sentence4": "On lui donne la pomme",
        "sentence5": "Il la donne à John",
        "sentence6": "Elle la lui donne",
        "sentence7": "Est-ce que la pomme est rouge? or Elle est rouge, la pomme?",
        "sentence8": "Les pommes est rouges",
        "sentence9": "Je dois la lui donner",
        "sentence10": "Je veux la lui donner",
        "sentence11": "Je le saurai demain",
        "sentence12": "Je ne peux pas manger la pomme"
    }
}
]
Ошибка попытки 1 - Использование UIKit
struct AppData: Codable {

    var name: String
    var id: Int
    var sentence: String
}

public class DataLoader {

    @Published var appData = [AppData]()

    init() {
        load()
        sort()
    }

    func load() {

        if let fileLocation = Bundle.main.url(forResource: "twelveData", withExtension: "json") {

            // do catch in case of error
            do {
                let data = try Data(contentsOf: fileLocation)
                let jsonDecoder = JSONDecoder()
                let dataFromJson = try JSONDecoder.decode([AppData].self, from: data)

                self.appData = dataFromJson
            } catch {
                print(error)
            }
        }
    }
    func sort(){
        self.appData = self.appData.sorted(by: {$0.id < $1.id})
    }
}
Ошибка попытки 2
import SwiftUI
import Foundation
import Combine

struct TwelveData: Codable, Identifiable {
    public var id: Int
    public var name: String
    public var sentence: String

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case name = "language"
        case sentence = "sentence"
    }
}

class TwelveSentences: ObservableObject {
    @Published var twelveData = [TwelveData]()

    init() {
        guard let path = Bundle.main.url(forResource: "twelveData", withExtension: "json") else { return }
        do {
            let data = try Data(contentsOf: path)
            DispatchQueue.main.async {
                self.twelveData = try JSONDecoder().decode([TwelveData].self, from: data)
            }
        } catch {
            print("error:\(error)")
        }
    }
}

struct ContentView: View {
    @ObservedObject var fetch = TwelveData()

    var body: some View {
        NavigationView {
            List(fetch.TwelveData) { TwelveData in
                VStack {
                    Text(TwelveData.name)

            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

1.Пожалуйста, проверьте, что вы json действительны здесь https://jsonformatter.curiousconcept.com/ 2. если действительный, я предлагаю вам использовать этот сайт для создания соответствующей структуры Swift, прямо сейчас ваш не совпадает с вашим json. Это является причиной ошибки https://app.quicktype.io/#l = Swift Исходя из вашего json фрагмента, ваша структура должна выглядеть следующим образом

// MARK: - WelcomeDetailElement
struct WelcomeDetailElement {
    let name: String
    let id: Int
    let sentence: Sentence
}

// MARK: - Sentence

struct Sentence {
     let sentence1, sentence2, sentence3, sentence4:  String
     let sentence5, sentence6, sentence7, sentence8: String
     let sentence9, sentence10, sentence11, sentence12: String
     let sentence1A, sentence1B, sentence2A, sentence2B: String?
     let sentence3A, sentence3B, sentence4A, sentence4B: String?
     let sentence5A, sentence5B, sentence6A, sentence6B: String?
     let sentence7A, sentence7B, sentence8A, sentence8B: String?
     let sentence9A, sentence9B, sentence10A, sentence10B: String?
     let sentence11A, sentence11B, sentence12A, sentence12B: String?
}

3. Затем вы можете проанализировать json и продемонстрировать это в списке.

import SwiftUI

// MARK: - WelcomeDetailElement
struct WelcomeDetailElement: Codable, Identifiable {
        let name: String
        let id: Int
        let sentence: Sentence
}

// MARK: - Sentence
struct Sentence:Codable {
        let sentence1, sentence2, sentence3, sentence4: String
        let sentence5, sentence6, sentence7, sentence8: String
        let sentence9, sentence10, sentence11, sentence12: String
        let sentence1A, sentence1B, sentence2A, sentence2B: String?
        let sentence3A, sentence3B, sentence4A, sentence4B: String?
        let sentence5A, sentence5B, sentence6A, sentence6B: String?
        let sentence7A, sentence7B, sentence8A, sentence8B: String?
        let sentence9A, sentence9B, sentence10A, sentence10B: String?
        let sentence11A, sentence11B, sentence12A, sentence12B: String?
}


struct ContentView: View {

    @State var result : [WelcomeDetailElement] = []

    var body: some View{
        List(result) {a in
            Text(a.name)
        }
        .onAppear(perform: parseJson)
    }

    func parseJson() {

        if let url = Bundle.main.url(forResource: "twelveData.json", withExtension: nil){

            if let data = try? Data(contentsOf: url){

                let jsondecoder = JSONDecoder()

                do{
                    let result = try jsondecoder.decode([WelcomeDetailElement].self, from: data)
                    self.result = result

                }
                catch {
                    print("error trying parse json")
                }
            }
        }
    }
}
0 голосов
/ 29 апреля 2020

Сначала нужно разобрать

class FecthYourObject: ObservableObject {

    @Published var yourObjects = [YourObject]()

    init() {
        guard let path = Bundle.main.url(forResource: "local_file", withExtension: "json") else { return }
        do {
            let data = try Data(contentsOf: path)
            DispatchQueue.main.async {
                self.yourObjects = try JSONDecoder().decode([YourObject].self, from: data)
            }
        } catch {
            print("error:\(error)")
        }
    }
}

, затем

struct ContentView: View {
    @ObservedObject var fetch = FetchYourObject()

    List(fetch.yourObjects) { obj in
      ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...