Как проанализировать данные JSON этого типа в массив? - PullRequest
0 голосов
/ 25 декабря 2018

RE-исправить код синтаксического анализа и получил следующий JSON.Как мне приступить к созданию 2 отдельных массивов: один для prefcode и один для prefName?

JSON:

[{"prefCode": 1, "prefName": "北海道"}, {"prefCode": 2, "prefName": "青森 県"}, {"prefCode": 3, "prefName": "岩手 県"}, {"prefCode": 4, "prefName": "宮城 県"}, {" prefCode ": 5," prefName ":" 秋田 県 "}, {" prefCode ": 6," prefName ":" 山形 県 "}, {" prefCode ": 7," prefName ":" 福島県 "}, {" prefCode ": 8," prefName ":" 茨城 県 "}, {" prefCode ": 9," prefName ":" 栃 木 県 "}, {" prefCode ": 10," prefName ":"} 馬 県 "}, {" prefCode ": 11," prefName ":" 埼 玉 県 "}, {" prefCode ": 12," prefName ":" 千葉 県 "}, {" prefCode ": 13," prefName ":"東京 都"}, {"prefCode": 14, "prefName": "神奈川 県"}, {"prefCode": 15, "prefName": "新潟 県"}, {"prefCode": 16, "prefName": "富山 県"}, {"prefCode": 17, "prefName": "石川 県"}, {"prefCode": 18, "prefName": "福井 県"}, {"prefCode": 19, "prefName":" 山} 県 "}, {" prefCode ": 20," prefName ":" 長野 県 "}, {" prefCode ": 21," prefName ":" 岐阜 県 "}, {" prefCode ": 22," prefName ":"静岡 県"}, {"prefCode": 23, "prefName": "愛 知 県"}, {"prefCode": 24, "prefName": "三重 県"}, {"prefCode": 25, "prefName": "滋 賀 県"}, {"prefCode": 26, "prefName": "京都 府"}, {"prefCode": 27, "prefName": "大阪 府"}, {"prefCode": 28, "prefName":" 兵 庫 県 "}, {" prefCode ": 29," prefName ":" 奈良 県 "}, {" prefCode ": 30," prefName ":" 和 歌 山 県 "}, {" prefCode ": 31,"prefName ":" 鳥取 県 "}, {" prefCode ": 32," prefName ":" 島 根 県 "}, {" prefCode ": 33," prefName ":" 岡山 県 "}, {" prefCode ": 34,"prefName": "広 島 県"}, {"prefCode": 35, "prefName": "山口 県"}, {"prefCode": 36, "prefName": "徳 島 県"}, {"prefCode": 37, "prefName": "香 川 県"}, {"prefCode": 38, "prefName": "愛媛 県"}, {"prefCode": 39, "prefName": "高 知 県"}, {"prefCode":40, "prefName": "福岡 県"},{"prefCode": 41, "prefName": "佐賀 県"}, {"prefCode": 42, "prefName": "長崎 県"}, {"prefCode": 43, "prefName": "熊 本 県"}, {"prefCode": 44, "prefName": "大分 県"}, {"prefCode": 45, "prefName": "宮 崎 県"}, {"prefCode": 46, "prefName": "鹿 児 島 県"}, {"prefCode": 47, "prefName": "沖 縄 県"}]

Код ViewController:

import UIKit
    import SwiftyJSON
    import Alamofire
    import Foundation

    struct Citys: Decodable {
        let prefCode: Int
        let cityName: String
        let cityCode: Int
        let bigCityFlag: Int

    }


    class ViewController: UIViewController {

        @IBOutlet weak var City: UILabel!


        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib


            if let BASEURL = URL(string: "https://opendata.resas-portal.go.jp/api/v1/prefectures?") {
                var urlRequest = URLRequest(url: BASEURL)
                urlRequest.httpMethod = HTTPMethod.get.rawValue

                var headers: HTTPHeaders
                if let existingHeaders = urlRequest.allHTTPHeaderFields {
                    headers = existingHeaders
                } else {
                    headers = HTTPHeaders()
                }
                headers["X-API-KEY"] = "4GMF0uUh7T9UHFvcp8xq6r4WnGnBA6arqJpuoPIS"
                //headers["Content-Type"] = "application/json;charset=UTF-8"
                headers["Content-Type"] = "application/json"
                headers["charset"] = "utf-8"
                urlRequest.allHTTPHeaderFields = headers

                let request = Alamofire.request(urlRequest)
                    .responseJSON { response in
                        //debugPrint(response)
                        guard let object = response.result.value else {
                            print("Error")
                            return
                        }

                        //print(response)
                        let propertyJSON : JSON = JSON(response.result.value!)
                        self.updateName(json: propertyJSON)

                }

            }
        }

        //MARK: - JSON Parsing
        /***************************************************************/

        func updateName(json : JSON) {

            for result in json {
                print(result.1)
            }

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Прежде всего, Бенни, данные, которые вы предоставили в виде данных JSON, недопустимы в качестве данных JSON.Есть довольно много ошибок.я перечислил их ниже:

  • в каждой паре ключ-значение ключ и значение должны быть разделены двоеточием :, а не =, как вы показали,Например: message = "<null>" ==> message: "<null>"
  • последовательные пары ключ-значение должны быть разделены запятой с, а не ;.Например: bigCityFlag = 2; cityCode = 01100; ==> bigCityFlag: 2, cityCode: 01100,

  • Также, я предполагаю, result должен быть массивом объектов.Если я прав в этом, то он должен быть заключен в [ ], а не ( ), что сделало бы это: result: ({ ==> result: [{.

Эммануэль предложил хороший способ внести эти изменения. Предполагая, что вы использовали этот или какой-то другой подход для преобразования его в действительные данные JSON, вы можете использовать следующий подход, чтобы вставить часть result всоответствующие массивы.

var SUCCESS = {
  message: "<null>",
  result: [{
    bigCityFlag: 2,
    cityCode: 01100,
    cityName: "\U672d\U5e4c\U5e02",
    prefCode: 1
  }, {
    bigCityFlag: 1,
    cityCode: 01101,
    cityName: "\U672d\U5e4c\U5e02\U4e2d\U592e\U533a",
    prefCode: 1
  }, {
    bigCityFlag: 1,
    cityCode: 01102,
    cityName: "\U672d\U5e4c\U5e02\U5317\U533a",
    prefCode: 1
  }, {
    bigCityFlag: 1,
    cityCode: 01103,
    cityName: "\U672d\U5e4c\U5e02\U6771\U533a",
    prefCode: 1
  }, {
    bigCityFlag: 0,
    cityCode: 47382,
    cityName: "\U4e0e\U90a3\U56fd\U753a",
    prefCode: 47
  }]
};

var bigCityFlag = [];
var cityCode = [];
var cityName = [];
var prefCode = [];

for (var i = 0; i < SUCCESS.result.length; i++) {
  bigCityFlag[i] = SUCCESS.result[i].bigCityFlag;
  cityCode[i] = SUCCESS.result[i].cityCode;
  cityName[i] = SUCCESS.result[i].cityName;
  prefCode[i] = SUCCESS.result[i].prefCode;
}

console.log("BIG CITY FLAG = [ " + bigCityFlag + " ]");
console.log("CITY CODE = [ " + cityCode + " ]");
console.log("CITY NAME = [ " + cityName + " ]");
console.log("PREF CODE = [ " + prefCode + " ]");
0 голосов
/ 25 декабря 2018

Это недопустимые данные Json, и я бы не рекомендовал использовать этот подход.Но если бы вам пришлось, вы могли бы разобрать его с помощью регулярных выражений и замен строк следующим образом.Учитывая, что переменная $ DATA содержит то, что вы опубликовали выше.

// Replace the following characters: ( ) = ; with these: [ ] : ,
// and escape backslashes, \ becomes \\ (also must be escaped for the str_replace call)
$DATA = str_replace(['(',')', '=', ';', '\\'], ['[',']',':', ',', '\\\\'], $DATA);

// Remove SUCCESS: from the start
$DATA = trim($DATA, 'SUCCESS:');

// Wrap keys with quotes ""
$DATA = preg_replace('/([a-zA-Z0-9]+)\s\:/', '"$1":', $DATA);

// Trim zeros from integer values
$DATA = preg_replace('/:\s[0]+[1-9]/', ': ', $DATA);

// Remove comma from last item in array
$DATA = preg_replace('/,([\r|\n|\s]+)([\[|\}|\)])/', '$1$2', $DATA);

// Decode Json
$JSON = json_decode($DATA);

// Voila!
print_r($JSON);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...