Tag: json

验证美国邮政编码(快速3)

今天,我正在进行一个副项目,该项目要求用户输入邮政编码才能找到本地餐馆。 我考虑过如何验证他们的邮政编码条目,以查看它们是否实际上是真实的美国邮政编码。 在进入代码之前,请注意一些有关邮政编码的有趣事实: ZIP代表“区域改善计划” 萨克斯第五大道的制鞋部门有自己的邮政编码:10022 由于邮件的增加,标准的5位数字长度是在1963年实施的。 这是我创建iOS应用程序的方法,该应用程序检查给定的5位数字是否为有效的美国邮政编码: 步骤1:获取有效的美国邮政编码数据(以CSV格式)。 我使用了从美国邮政编码下载的Excel电子表格数据。 我选择了“个人”帐户(即免费),因为我会将数据用于博客目的。 邮政编码数据库–邮政编码列表 下载Excel / CSV /电子表格格式的邮政编码列表,包括州,城市,县,区号,纬度… www.unitedstateszipcodes.org 注册免费/个人帐户后,我下载了一个zip_code_database.csv文件(如果需要,您也可以将其下载为.xls)。 步骤2:将CSV数据转换为JSON。 我使用网站Convert CSV将CSV转换为JSON。 CSV到JSON转换器 将CSV数据转换为JSON www.convertcsv.com 在网站上,要生成输出,我选择了“ CSV到JSON列数组”转换类型进行下载。 单击“下载结果”后,我收到了一个名为convertcsv.json的文件。 步骤3:重命名JSON并拖入XCODE项目。 我将文件重命名为zipcodes.json 。 步骤4:编写代码以读取JSON邮政编码。 我创建了一个名为ZipCodeStore.swift的文件来保存此逻辑。 1-我编写了一个静态函数,该函数将发送带有一个Ints数组的完成闭包(将是有效的邮政编码!) 2 —我在项目中解包json文件的URL位置,并通过资源名称和扩展名类型对其进行标识。 3-我将此文件转换为数据。 4 —我将此数据序列化为JSON对象。 5 —我将json转换为适当的类型[String:[Int]]。 6 —我访问json中的“ zip”键以获取我的邮政编码数组。 7 —我使用zipArray设置完成。 步骤5:构建UI。 在情节提要中,我拖了一个文本字段,一个按钮和一个标签。 我确保仅使用数字键盘输入了文本字段的文本。 然后,我建立了从Storyboard到ViewController.swift文件的插座和动作连接。 8 —这些是上述视图元素的出口。 步骤6:使用邮递区号资料建立本机阵列。 9 —创建一个Int的zipArray,它将保存从json返回的邮政编码。 10 —在.readJson函数上调用完成时,我将zipArray与返回的邮政编码数组(邮政编码)一起注入。 […]

最快捷的包装

每个程序员都听说过JSON格式。 很好,易于理解,可以采用。 在大多数情况下,它用于服务器和客户端应用程序之间的通信。 但是……您可能会意识到,当您拥有大数据集以进行快速传输时,这不是最佳选择,无法真正对本机模型进行快速序列化或反序列化。 因此,还有其他一些但尚未流行的格式。 例如,谷歌使用的格式叫做Flatbuffers 。 最初,他们是为游戏开发和其他性能关键型应用程序创建的。 现在,Facebook将其用于数据传输。 在我们公司中,我们讨论了在客户端和服务器端进行JSON替换应采用的最佳格式。 由于体积小和性能好,我们观察到了MessagePack格式。 我已经在github上访问了已知的MessagePack实现,以便将其集成到我们的swift项目中。 经过一番苦苦挣扎和几次卡纸试验后,我终于找到了a2消息打包器 。 打包和解压缩我们复杂的结构和类层次结构变得微不足道。 有关如何使用此打包程序的完整而详细的技术教程,请参见Wiki github页面 。 集成后,我们具有以下性能: 优化标记=快速,iPhone 4,JSON文件大小2.7 MB(zip 190kB) 从JSON文件加载NSData = 0.0921s 将NSData转换为JSON对象= 1.203s JSON转换为本机模型= 3.2691s 原始模型打包到字节数组= 3.051s 字节数组到NSData = 0.0033s NSData到Byte数组= 0.00390s 本地模型的字节数组= 2.6518s 将NSData写入文件= 0.101s 为了进行测试,我们有一个大的JSON文件。 字节数组表示以MessagePack格式打包的数据。 将字节数组转换为原始模型的速度明显快于将标准JSON对象转换为原始模型的速度。 swift中的JSON对象表示实际上是NSDictionary或NSArray。 而且,打包的模型可以轻松转换为NSData并写入文件。 打包数据的文件大小约为743kB,比原始JSON文件小约3.5倍。 它被压缩到200kB,这与压缩后的JSON文件的大小类似。 我相信,通过一些技巧,MessagePack模块可以大大加快速度,就像在FlatBuffers格式中所做的那样,正如您在本文中所看到的。 快速应用程序中的本机模型应用程序也可以使用系统基础上的NSKeyedArchiever类保存到文件中,但事实证明,它比同样的MessagePack-ing慢几倍。 这种打包概念使您可以从Cocoa框架和NSObject类轻松地编写代码。 MessagePack格式的唯一缺陷是它的无方案。 打包数据投入生产后,很难添加或删除属性。 无论如何,MessagePack都很棒。 所以,去吧。 […]

自动生成的Swift网络模型-JustBinary-中

自动生成Swift网络模型 永远不要再编写网络模型。 下一步 ModelSynchro目前正在积极开发中,仍然可以添加一些很酷的功能。 我一如既往地重视反馈,并鼓励对改进此广告连播的任何想法。 最初于 2018 年4月15日 发布在 medium.com 上。

JSON Wars:可编码⚔️Unbox

最初发表在 Swift Post上 。 Codable让所有人都感到兴奋,因为我们都喜欢解析JSON,并且很高兴将此工具作为标准库的一部分。 现在是时候测试它是否值得成为我们最喜​​欢的一个了。 让我们看看Codable在恶劣条件下的性能。 我们将使用Codable解析以下JSON,然后将其与流行的Unbox / Wrap实现进行比较。 { “placeName”: “İstanbul, Turkey”, “lat”: 41.0049823, “lon”: 28.7319958, “dateAdded”: “2018-05-25”, “info”: “İstanbul is a very historical city.” } 我们希望我们的数据模型如下所示。 struct Place: Codable { let name: String let coordinate: Coordinate let dateAdded: Date let info: String? } struct Coordinate { let latitude: Decimal let longitude: Decimal […]

在Swift 4中关于JSON解析的简短思考

首先,将Codable定义为typealias Codable = Decodable&Encodable,我们采用两种必需的协议: 可解码 :解析JSON(获取响应) –通过解码JSONData,我们将接收/读取数据 2. Encodable :生成JSON(响应后) –要将可编码 类型转换为Data 。 它适用于基本类型(Int,String和Float等),某些基础类型(数据,URL,日期等)以及数组,字典和可选参数(枚举)。 – NSData – NSString – NSNumber – UInt – Int – Float – Double – Bool – NSDate – NSArray – NSDictionary 为什么? 在我们的数据管理器中简化依赖关系 将数据结构转换为JSON数据从未如此简单(hmmmm ..),允许开发人员将JSON数据存储到磁盘或将其编码为URLRequest的httpBody :)。 您可以编写一个使用外部来源的JSON或通过存根进行测试的应用。 这里的开始问题是您在应用程序中建模的概念的结构与JSON生产者建模的概念之间的不一致。 在您的应用中更改和使用JSON结构的一些示例: 使用CodingKey更改名称属性 2.通过手动编码和解码简化复杂的结构 3.使用嵌套数据(数组JSON内的数组) 对于1.,即使我们不必解析JSON表示形式的每个元素,我们也需要创建与JSONData中名称相同的属性,或者使用CodingKey重命名它们以直接存储基本示例。 到目前为止很简单!🤠🤠 struct SurfBoard:可编码{ var品牌:字符串 var size:大小 枚举CodingKeys:字符串,CodingKey […]

在JSON API中处理传入数据

我被问到的常见问题之一是如何处理来自移动或Web应用程序的不同格式的请求。 可以为JSON API提交数据的三种主要方式: 通过URL传递的数据(即http://www.example.com/api/v1/stuff?var1=myName) 作为POST请求中的表单参数 作为JSON提交的POST,PATCH或PUT请求的主体。 因此,我将从“完美应用程序模板”的一个简单实例开始: $ git clone https://github.com/PerfectlySoft/PerfectAppTemplate.git jsontest $ cd jsontest $ swift包generate-xcodeproj 这将创建一个Xcode项目…打开它,然后打开“ Sources-> Perfect-App-Template-> configuration-> Routes.swift” 在第29行,有一条GET请求的路由,URI为“ /” 如果我们现在按原样运行此项目,则它将构建应用程序并运行它。 要运行:从“方案”下拉列表中选择可执行目标,然后运行(CMD-R)。 然后,在浏览器中访问http:// localhost:8181-您将看到“ Hello,World!” JSON路由和Postman测试 尽管我们可以使用浏览器轻松测试GET路由,但对于其他请求类型(如POST)却并非如此简单。 这是诸如Postman之类的工具介入的地方-这使我们能够通过各种选项模拟不同类型的请求。 JSON GET路线 我们需要添加的两件事是路由,以及该路由的处理程序。 路线: route.append([[“ method”:“ get”,“ uri”:“ / api / v1 / test”,“ handler”:Handlers.JSONtestGET]) 这指向新的路由Handlers.JSONtestGET ,我们需要创建它: 静态函数JSONtestGET(data:[String:Any])抛出-> RequestHandler { 返回{ 请求,回应 做{ […]

Swift中的JSON解析—第一部分:JSON解析的通用协议

对于iOS开发人员而言,解析JSON是一项非常常见的任务。 但是,Foundation框架提供的现成功能非常基础。 有许多可用的开源库可实现更高级别的功能,并有望使此任务更轻松,更安全。 作为个人实验,我尝试实现自己的JSON解析库,该库以我真正喜欢的几种方法为模型。 我的实现旨在实现极简主义,并专注于基于通用协议的方法,该方法应允许解析JSON内容,并以最少的代码将其存储在适当的容器( 类或结构实例)中。 为了使复杂性最小化,将没有特殊的错误处理:在不幸的情况下,解析特定的JSON密钥失败,相应的存储值将为nil 。 开箱即用的解决方案 假设我们需要与Web服务进行交互,该Web服务返回如下所示的JSON内容: { “位置”:[{ “ label”:“首页”, “数据”:{ “ address”:“ 6925 Felicity Coves”, “ city”:“ East Davin”, “ state”:“华盛顿”, “国家”:“美国”, “ zipCode”:“ 22998-1456” } }, { “ label”:“工作”, “数据”:{ “ address”:“ 0506 Gretchen River”, “ city”:“亨廷顿海滩”, “ state”:“ Connecticut”, “国家”:“美国”, “ zipCode”:“ 61182-9561” } }] } Swift通过NSJSONSerialization类提供了一种解析JSON的默认方法。 我们可以将JSONObjectWithData用于此类任务,并在确认返回类型符合我们的预期( […]

MVVM->避免“紧急汤”

设置 在过去的几年中与MVC和MVP在可可粉接触领域合作之后,我认为现在应该退后一步,考虑MVVM方法。 最近,我在Ben DiFrancesco上观看了一次演讲,他在会议上讨论了如何以及为何在项目中采用MVVM。 Ben解释了如何在您的ViewControllers中添加目标/动作,委派,通知,KVO和块(Swift中的闭包)实际上只是创建了这种“命令性汤”,在此情况下,您需要为业务逻辑和其他代码做出复杂的推理。 此外,由于您与特定于平台的框架紧密耦合,因此将代码测试和定位到其他平台变得更加困难。 从经验上来讲,当您想开始向应用程序添加扩展时,这绝对成为问题。 确保您的所有业务逻辑都适用于Today,Watch和其他扩展, 并且如果不小心处理实现,您的主应用程序将是一场噩梦。 回顾MVC 对于iOS中的MVC,控制器具有共同的职责; 表示逻辑与业务逻辑混合在一起。 这创造了Ben谈论的当务之急:“最终结果是使代码难以理解,难以测试并且[通常]丑陋的代码。” 让我们看一下MVVM如何尝试解决此问题。 MVVM概述 使用MVVM,我们引入了一个称为ViewModel的新对象,该对象封装了表示逻辑。 ViewModel使用一个模型或一组模型,并创建已预先格式化以在视图上呈现的属性。 Ben给出的示例是格式化字符串,确定子视图的颜色,设置显示/隐藏布尔值或确定表视图中的行数。 使用这种模式,ViewController的工作变得简单得多,因为它只是将ViewModel属性连接到视图属性。 示例应用 本着学习新事物的精神,我们将通过制作示例应用程序来测试MVVM技能。 想象一下,您刚刚被一家摄影公司聘用为新职位,他们委托您制作一个应用程序来展示公司的代理商目录及其投资组合。 他们决定使用Portfolious这个名字,是因为它在时髦/时髦的焦点小组中表现很好。 无论如何,在Portfolious中,您将拥有一个座席列表,其中包含与他们有关的数据以及他们的工作组合。 首先,您将使用此JSON占位符数据的子集和最近启用的最新网络库。 您可以在Github上签出完整的项目。 应用布局 使用Sketch,我们将创建一个视图来展示Portfolious的主题。 我们将有一个座席的表格视图,其中每个单元格将具有一些基本信息,例如其名称。 进入代理后,您将获得扩展的详细信息集(由用户模型提供)。 在此下方,我们将看到其相册的表格视图,其中每个相册将呈现该相册中照片的集合视图。 资料模型 对于我们的数据源,我们将使用三个主要模型:用户,相册和照片。 每个用户都是该目录中的一名员工,当您进入他们的个人资料时,我们会在其中添加他们最喜欢的照片的相册。 用户的定义如下: { “ id”:1 “ name”:“ Leanne Graham”, “用户名”:“布雷”, “电子邮件”:“ Sincere@april.biz”, “地址”: { “街道”:“库拉斯之光”, “ suite”:“ Apt。556”, “ city”:“ Gwenborough”, “邮政编码”:“ […]

Swift 4.2可降解:异构集合📚

继去年发布Codable协议之后,许多iOS开发人员一直在忙于删除沉重的自定义JSON解析器,并在模型层中将它们替换为对Decodable的流畅且轻量级的构造……我也不例外:在最近的项目中作为一个客户,我很高兴增强大型应用程序的模型层,其目标之一就是完全符合Codable。 挑战1:嵌套的异构集合 最初,过渡到Decodable的过程很顺利(“祝您删除代码愉快!” )。 但是,自定义JSON解析器的删除导致重要的类类型映射的删除-原本功能强大的Codable协议未直接支持Codable 。 为了举例说明我在说什么,请考虑以下几点: 在这种非常简单的情况下,我们有一个超类Pet,它被两个类Cat和Dog继承,从而允许一个人拥有一个超类Pet的单个集合,而集合中的实际对象是Pet, Cat or Dog类型。 从JSON解码Person对象时会发生问题,因为“宠物”列表中的对象不是同一类型: 宠物列表将在Person初始化程序中像这样解码: container.decode([Pet].self, forKey: .pets) ,但这样做将检索超类Pet对象的列表,从而失去所有子类属性。 用Cat或Dog代替Pet也是不够的,因为我们对每种不同的类型(包括它们各自的属性)都感兴趣。 同时使用JSONSerialization反序列化JSON以使用类型区分JSONSerialization进行映射,似乎完全消除了使用Codable的好处,因为这是使用旧JSON解析器完成的方式。 解决方案:集中类映射 幸运的是,我并不孤单地遇到这个问题:Tom Stoffer写了一篇很棒的文章,介绍如何处理嵌套在Decodable对象中的异构列表。 尽管此解决方案在某种情况下是好的,但对于大型项目而言,这并不是一个非常干净的解决方案,因为我们可能会重复类型映射代码,因此我们可能会遇到多个对象相同的异构列表。 为了解决这个问题,我们可以将类型信息(映射)提取到类家族的集中位置。 这可以通过利用快速枚举上的函数来完成。 目标是通过公开用于检索正确映射的类型的函数以及JSON有效内容中类型鉴别符的键,来创建一个表示相关类家族的枚举。 因为我们希望解决方案尽可能通用,所以我们可以编写一个协议来定义所需的公开信息: 注意:仅在您为鉴别器使用不同键的情况下,才真正需要鉴别器类型。 (在我正在从事的项目中,我有两个不同的键)。 此外,鉴别变量是静态的-稍后会详细介绍。 ClassFamily协议允许我们创建一个描述任何对象族的枚举。 让我们看一个例子,说明我们的Pet案例的枚举是什么样的: 太好了,这个枚举现在描述了我们的宠物对象家族! 然后,我们可以直接在Person类的可解码的初始化程序中使用它,如下所示: 但老实说,此解决方案仅提取了映射,并没有真正使初始化程序更简洁。 因此,为了解决这个问题,我们将在KeyedDecodingContainer:的扩展中创建解码函数的泛型重载KeyedDecodingContainer: 这样做可以使我们极大地清理Person的初始化程序: 我们已经完成了可解码对象的嵌套异类列表的解决方案-干净整洁,不是吗? 但这不是全部… 挑战2.异构集合作为返回类型 …如果异构集合未嵌套在Decodable对象中怎么办? 例如,考虑以下情况: Person的Pets集合不是属性,而是在运行时通过API调用从服务器获取的: 在这种情况下,问题仍然存在: [Pet]类型的解码将导致带有名称的未知宠物的列表。 使用Cat或Dog也是不够的,并且为了像Tom Stoffer的方法一样,我们不像在Person类的初始化程序中那样具有带键控容器的Decoder对象。 令我惊讶的是,我在Stackoverflow或其他地方找不到很多类似情况的信息,然后返回反序列化JSON以读取鉴别符类型,然后进行解码,这对我来说是不可接受的。 解决方案:包装器类! 因此,经过数小时的类型推断问题和编译错误,我设法使用包装器类和一些枚举提出了一个通用解决方案。 这个想法是能够通过利用相同的类家族枚举来使用与嵌套集合相同的方法。 为此,我们必须围绕可解码类(及其子类)创建一个包装器类,然后可以将其映射到正确的类型。 让我们看一下如何实现它。 包装器必须是可解码的,以便我们使用JSONDecoder直接对其进行解码。 此外,它需要保留对我们希望创建的对象的引用。 […]

自动生成Swift网络模型– JustBinary

自动生成Swift网络模型 永远不要再编写网络模型。 无论您是移动开发的新手还是经验丰富的移动开发人员,您都很可能会遇到将API集成到移动应用程序中的情况。 将JSON转换为可用模型的艺术可能是乏味的,也是一项令人讨厌的工作。 出于本文的目的,我们将使用下面的Library JSON响应来生成我们的Swift网络模型。 下一步 ModelSynchro目前正在积极开发中,仍然可以添加一些很酷的功能。 我一如既往地重视反馈,并鼓励对改进此广告连播的任何想法。