写了几天 Java,发现处理个 JSON 都好麻烦,以前写 JS 完全没过这事,大家是怎样转变过来这种思维的呢?
1
congeec 2018-04-06 12:17:05 +08:00 via iPhone
你才写了几天
|
2
accfcx 2018-04-06 12:23:09 +08:00 via Android
从 c 到 Java
|
3
lihongjie0209 2018-04-06 12:23:37 +08:00
HashMap<String,Object> result =
new ObjectMapper().readValue(JSON_SOURCE, HashMap.class); 随便在网上找的, 哪里麻烦了 |
4
noe132 2018-04-06 12:23:41 +08:00 via Android
常年写 js,什么时候 js 能像 java 一样静态类型
|
5
murmur 2018-04-06 12:25:54 +08:00
你需要一个 idea
|
6
notreami 2018-04-06 12:28:35 +08:00 2
别用 js 的思维套 java,。
fastjson、jackson、gson。随便一个库,就能解决你纠结的问题。 |
7
lhx2008 2018-04-06 12:29:19 +08:00 via Android 4
以长比短有什么办法?
常年写 java,转到 js,怎么写多线程?大家是怎么转变思维的呢。 |
9
notreami 2018-04-06 12:31:04 +08:00
@lihongjie0209 这个有种强行答题的感觉,ObjectMapper 是哪里来的?为什么要转成 Map,而不是直接对象?
|
10
lihongjie0209 2018-04-06 12:32:38 +08:00
@notreami https://stackoverflow.com/questions/443499/convert-json-to-map 随手复制的, 具体自己看, 只是想说明这种问题根本不存在
|
11
learnshare 2018-04-06 12:33:37 +08:00
写 Node.js
|
12
xiandao7997 2018-04-06 12:34:31 +08:00 via iPhone
@noe132 typescript 还行~
|
13
lxy 2018-04-06 12:56:26 +08:00 1
是的,超麻烦,如果要将 Json 完全解析成一个对象(有明确的类型,如 String、Integer、List 之类,而不是 Object ),则需要定义一个与 Json 结构相同的 class。3 楼那种是不完全解析。我写了半年 Java 的确很憋屈,Python 就自由得多。
|
14
grantonzhuang 2018-04-06 12:57:11 +08:00 via Android
@notreami 然而 js 里面对象就是个 map。。。
|
15
param 2018-04-06 13:00:23 +08:00 via Android
是超麻烦没错。
|
16
pandago 2018-04-06 13:11:10 +08:00 via iPhone
多写就习惯了
|
17
honeycomb 2018-04-06 13:18:50 +08:00 via Android 1
@notreami 习惯可以不同,在 Java 里要做 json 反序列化第一个想到的肯定是 Jackson,gson 那些库。强类型的语言多少会有这种麻烦。
|
18
IvanLi127 2018-04-06 14:03:23 +08:00 via Android
如果不是必须要 java,那么 typescript 了解一下?
|
19
TakWolf 2018-04-06 14:11:43 +08:00 1
常年写 Java,求教怎样适应 JS ?对象里面有啥都不知道,点也点不出来(滑稽)
根本原因是静态语言编程思维和动态语言编程思维的差别 |
20
raphaelsoul 2018-04-06 14:12:02 +08:00
别适应了 我情况和你差不多...
一边骂 java 一边哭着写。一种被猛男操哭的感觉 最近上手 ts 感觉非常良好 js 代码一下子就安全舒服多了 |
22
janus77 2018-04-06 14:52:55 +08:00
不要适应,就当零基础的去学
差别太大没法类比的 |
23
lihongjie0209 2018-04-06 14:56:41 +08:00 1
喜欢直接用动态语言 Map 直接处理 Json 的, 不知道你们如何对下面的 Json 做校验呢(例子来自: http://json.org/example.html)
如果直接用 Map, 请问这么写你们不胆战心惊吗: Json["web-app"]["servlet"]["servlet-name"] {"web-app": { "servlet": [ { "servlet-name": "cofaxCDS", "servlet-class": "org.cofax.cds.CDSServlet", "init-param": { "configGlossary:installationAt": "Philadelphia, PA", "configGlossary:adminEmail": "[email protected]", "configGlossary:poweredBy": "Cofax", "configGlossary:poweredByIcon": "/images/cofax.gif", "configGlossary:staticPath": "/content/static", "templateProcessorClass": "org.cofax.WysiwygTemplate", "templateLoaderClass": "org.cofax.FilesTemplateLoader", "templatePath": "templates", "templateOverridePath": "", "defaultListTemplate": "listTemplate.htm", "defaultFileTemplate": "articleTemplate.htm", "useJSP": false, "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineRobotsDb": "WEB-INF/robots.db", "useDataStore": true, "dataStoreClass": "org.cofax.SqlDataStore", "redirectionClass": "org.cofax.SqlRedirection", "dataStoreName": "cofax", "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser": "sa", "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreInitConns": 10, "dataStoreMaxConns": 100, "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", "maxUrlLength": 500}}, { "servlet-name": "cofaxEmail", "servlet-class": "org.cofax.cds.EmailServlet", "init-param": { "mailHost": "mail1", "mailHostOverride": "mail2"}}, { "servlet-name": "cofaxAdmin", "servlet-class": "org.cofax.cds.AdminServlet"}, { "servlet-name": "fileServlet", "servlet-class": "org.cofax.cds.FileServlet"}, { "servlet-name": "cofaxTools", "servlet-class": "org.cofax.cms.CofaxToolsServlet", "init-param": { "templatePath": "toolstemplates/", "log": 1, "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize": "", "dataLog": 1, "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize": "", "removePageCache": "/content/admin/remove?cache=pages&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", "lookInContext": 1, "adminGroupID": 4, "betaServer": true}}], "servlet-mapping": { "cofaxCDS": "/", "cofaxEmail": "/cofaxutil/aemail/*", "cofaxAdmin": "/admin/*", "fileServlet": "/static/*", "cofaxTools": "/tools/*"}, "taglib": { "taglib-uri": "cofax.tld", "taglib-location": "/WEB-INF/tlds/cofax.tld"}}} |
24
orangeade 2018-04-06 15:01:02 +08:00 via Android
|
25
orangeade 2018-04-06 15:04:23 +08:00 via Android
不想每次加默认值也有 default dict 这种内置数据结构
|
26
lihongjie0209 2018-04-06 15:16:38 +08:00
@orangeade #24 把这个用 Python 写一下 Json["web-app"]["servlet"]["servlet-name"]
|
27
v2dead 2018-04-06 15:43:00 +08:00
@lihongjie0209 你自己不都写出来了么?没错,python 字典也可以这么使用。就 Json["web-app"]["servlet"]["servlet-name"]就可以了。
|
28
jtsai 2018-04-06 15:45:35 +08:00 1
@lihongjie0209
#3 JSON.parse() 哪里不麻烦 首先要适应 Java 就要先承认 Java 是极其笨重和繁琐的语言, 然后自我催眠, 淡定 Java 的工资很高 淡定 Java 的工资很高 淡定 Java 的工资很高 ... |
29
zjsxwc 2018-04-06 15:45:39 +08:00
我从 java 转 php 等脚本语言后后再也不想写 java 了,太懒不想写
|
30
v2dead 2018-04-06 15:48:34 +08:00
对了你说校验或者胆颤心惊的问题么?容易出错的代码块为什么不加入异常捕获呢?你可以说我懒,或者效率问题,但是我都用这类脚本来实现业务了,这个效率是我第一优先考虑的问题么?
|
31
lihongjie0209 2018-04-06 15:55:41 +08:00
@v2dead #27 如果其中一个是 None 呢? 我会 Python
|
32
lihongjie0209 2018-04-06 15:57:27 +08:00
@v2dead #30 假如有 10 个字段, 一个是 None, 你 Try Cache 之后怎么处理, 全部放弃还是保留剩下的 9 个, 如果保留, 怎么实现?
|
33
lihongjie0209 2018-04-06 15:59:29 +08:00
@jtsai #28 一切都是 tradeoff, 写起来麻烦一点带来的是编译期安全, 写起来爽的带来的是运行期异常
|
34
lihongjie0209 2018-04-06 16:00:39 +08:00
@v2dead #30 效率从来不是首先考虑的问题, 代码的健壮性才是
|
35
johnniang 2018-04-06 16:03:35 +08:00 via Android
都在拿着其他语言的长处和 Java 的短处比,有意思么
|
36
lihongjie0209 2018-04-06 16:06:57 +08:00
@johnniang #35 也是好事情, 其他语言的长处说明解决了一些痛点, Java 只要跟的上, 这些东西迟早内置到 JDK 中
|
37
shenjo 2018-04-06 16:09:20 +08:00
@lihongjie0209 JS 里的话 lodash get 了解一下?
const obj = { 'web-app':{ 'servlet':{ 'servletName':'realName' } } } _.get(obj,'web-app.servlet.servletName') // realName _.get(obj,'web-app.unknown.servletName') // undefined |
38
xiandao7997 2018-04-06 16:12:58 +08:00 via iPhone
好奇用 java 的项目为啥不转到 kotlin 呢,是因为要额外的学习成本 人难招 还是各个框架的兼容性还不够?
|
39
v2dead 2018-04-06 16:13:19 +08:00
@lihongjie0209 这么钻牛角尖就没意思了,怎么处理是业务的问题。不是需要怎么处理就怎么处理么?你会 Python 你自己不知道怎么保留 9 个么?要保留 9 个就保留 9 个呗。你这问题是在面试我么?
|
40
lihongjie0209 2018-04-06 16:16:16 +08:00
@shenjo #37 这个不错, 假设有这样的代码 100 行, 如果我改变 Json 对象任意一个根节点的名称, 你需要修改多少行代码? 需要写多少单元测试才能确保不出错
|
41
lihongjie0209 2018-04-06 16:16:59 +08:00
@v2dead #39 你把代码写出来就知道为什么不能这么做了
|
42
lihongjie0209 2018-04-06 16:19:17 +08:00 1
直接使用 Map 的问题不在于解析,异常处理, 而在于没有封装, 任意一个改动都会导致大量的代码修改
|
43
yaoliyc 2018-04-06 16:24:01 +08:00 via iPhone
@lxy 自由不是没有代价的,java 通过类将数据结构描述清楚集中在一起,js 之类键值对基本分散在各处,各有利弊。
|
44
starmoon1994 2018-04-06 16:24:02 +08:00
是 maven 不好用?
还是 Java 提供的基础类库少了? |
45
kennylam777 2018-04-06 16:26:11 +08:00 1
@lxy 如果你用的 API 都有良好的 documentation, 或者是 Swagger 那種按 API 定義自動生成的, 你應該會覺得把 json 結構寫成 class 會舒服很多
如果寫後台都是隨心所欲的在改結構又不給 doc, 那我才擔心這種設計合作起來會異常麻煩 最怕那種會直接返回不同結構的 API, 奇怪的狀況要動用 json parser 處理而不是 status code, 根本是浪費大家時間 |
46
deadEgg 2018-04-06 16:26:34 +08:00 1
java oo 的东西顺手起来会觉着爽到
|
47
bbzt 2018-04-06 16:30:18 +08:00
|
48
lihongjie0209 2018-04-06 16:32:59 +08:00
@bbzt 我会封装成 Json.getservletName(), 随便怎么改都可以
|
49
bbzt 2018-04-06 16:36:58 +08:00
|
50
kennylam777 2018-04-06 16:41:52 +08:00
拿 23 樓那種超長的例子來說, 如果只是有一天 web-app.servlet.servlet-name 改成了 web-app.servlet.servlet-id
如果有結構封裝, 要改代碼的話, 就把封裝 json 結構的 class 找出來改掉 class servlet{ String servlet-name; } 直接用 IDE 的 refactor 改成新的 field 名字, 這樣引到用這 field 的地方都會自動改掉, 引用 1 次還是 100 次都沒差 class servlet{ String servlet-id; } 沒有封裝的話, 如果用 Json["web-app"]["servlet"]["servlet-name"] 的, 嗯, 你們就慢慢手動的 search,再看看是否相關, 然後才 replace......這種 code 你自己用得開心就好, 不要留下來了 |
51
lihongjie0209 2018-04-06 16:42:39 +08:00
@bbzt #49 浏览器支持率多少?
|
52
bbzt 2018-04-06 16:48:13 +08:00
|
53
lihongjie0209 2018-04-06 16:50:49 +08:00
@xiandao7997 #38 主要原因是没有必须迁移的原因, 我没有用过 kotlin, 但是迁移造成的影响是可知的
1. BUG: 新的语言和框架必然有 BUG, 也就是稳定性没有经过时间的考验, 除了问题谁负责解决? 2. 人力成本: 开发者必然需要投入时间学习, 甚至需要经过一两个项目才能完全迁移到新的语言 3. 历史包袱: 已有的基础设施是否可以重用, 不可重用的话也要做迁移, 迁移之后还要测试维护. 4. 开发者个人体验: 对于项目组来说, 不关心. |
54
lihongjie0209 2018-04-06 16:54:19 +08:00
@bbzt #52 既然有 Babel, 那么也要配一个 webpack 吧, 然后 npm 安装上百个依赖, 最后我可以开心的用 class 了
|
55
bbzt 2018-04-06 16:57:37 +08:00
|
56
lihongjie0209 2018-04-06 16:58:49 +08:00
@bbzt #55 那还要 webpack 配置工程师干嘛
|
57
orangeade 2018-04-06 17:04:01 +08:00
@kennylam777 #45
@lihongjie0209 #42 这又不是 Java 的专利,json 封装为对象方式那么多 https://stackoverflow.com/questions/6578986/how-to-convert-json-data-into-a-python-object |
58
l30n 2018-04-06 17:05:27 +08:00 via Android
Java 刚转前端,累啊
|
59
lihongjie0209 2018-04-06 17:08:57 +08:00
@orangeade #57 该个字段名称试试
|
60
kennylam777 2018-04-06 17:11:03 +08:00
@orangeade
對我來說, 只要有封裝的都是可行的設計方法, 我還有用 Golang 呢, 近來在練 Kotlin |
61
v2dead 2018-04-06 17:12:35 +08:00 2
是否有封装这种问题的出现不应该取决于对 json 这一类外来数据的处理方式上面,而是来自良好的编码习惯。像这种看起来像是配置类的 json 数据,进行配置的时候必然是带封装的,因为可能要考虑配置变更或者是数据来源的不同,但怎么处理 json 是另外的问题。不是说用 map 处理我就不能做封装了,对待不同的行为的时候做法也是完全不一样的。
比方这个 json 数据来源现在是来自外部消息处理,外部消息是不可靠而且来源多样的,根本无法去做各类预设,而且也不会扩散到其他的业务模块,这时候提前设定结构就是很蠢的设定。数据源怎么解析,和是否封装良好没有直接关系。 |
62
qinxi 2018-04-06 17:19:21 +08:00
以前用 java 写后台.现在用 node 要学 ES6 7 ts webpack express
|
63
lihongjie0209 2018-04-06 17:25:51 +08:00
@v2dead #61
是否有封装这种问题的出现不应该取决于对 json 这一类外来数据的处理方式上面,而是来自良好的编码习惯。 反驳: 封装就是取决与如何对 Json 建模, 如果用 Map, 那么你就把 Json 的内部结构完全暴露给客户端. 良好的编码习惯就是 information hiding. 数据源怎么解析,和是否封装良好没有直接关系。 反驳: 这点我同意, 数据源的解析应该封装起来, 不被客户端知道, 问题是你解析完成之后你给客户端返回什么? Map? 和不封装没什么区别. 对象? 那么你就要预先定义好接口, 那么就和你说的第二段话矛盾了. |
64
ipwx 2018-04-06 17:26:19 +08:00
@lihongjie0209 我觉得 @v2dead 说的很对。你举的这个例子,这么冗长复杂的配置文件,在别的语言里面是不受待见的。像 Python、JS 处理 JSON 对象,一般只会出现在 API 接口处,然后立刻就处理掉了,没多少机会传播到别的地方的。所以也就没有什么不容易重构的坑了。
|
65
lihongjie0209 2018-04-06 17:27:20 +08:00
@qinxi #62 这就是我不喜欢前端的原因, 一个语言社区应该做的事情让每一个开发者都做一遍, 浪费多少时间
|
66
ipwx 2018-04-06 17:27:28 +08:00
@lihongjie0209 另外你太小看 IDE 了。Webstorm 完全可以重构代码里面看得到结构的对象( return {a: xxx, b: xxx} 这种),用起来和 Java 定义过的结构没有本质区别。
|
67
lihongjie0209 2018-04-06 17:30:01 +08:00
@ipwx #64 首先, 这只是一个从 Json 官网拿下来的例子. 其次, 这种大对象我做的项目中随便都能找到, 应该每个项目都有. 最后你提到的处理那应该是会给调用者返回一个 Map 或者对象, 请问具体是怎么处理的
|
68
lihongjie0209 2018-04-06 17:31:30 +08:00
@ipwx #66 动态语言的重构从来都不简单甚至是信不过的, 更不要说涉及到字符串了
|
69
kennylam777 2018-04-06 17:31:47 +08:00
@v2dead 如果是外部不確定的來源, 做一個非完整的 sturct 就好, 只為需要的(needed)及已知的(known)的地方寫 fields, 像 jackson 般就是可以把沒定義的 fields 全放在 map 之中, 兩者兼顧到
如果整天接到的 json 都是亂來的, 也就認了 |
70
v2dead 2018-04-06 17:38:11 +08:00
可能我们的封装不是一个层次的,就拿配置说事,我的意思是外部请求配置必然有明确的接口,确定的结构。而数据源解析只是这个配置下的一小部分,如果封装就是指对 json 建模这种粗浅的事情了,我问你现在配置来源变成 xml 了呢?变成 properties 了呢?你的建模又如何处理?我个人喜好用 map 去处理原始 json,并不意味着我要暴漏细节给我的用户。
|
71
jinsongzhao 2018-04-06 17:58:37 +08:00 via Android
@raphaelsoul 由衷的笑了。
|
72
jinsongzhao 2018-04-06 18:09:44 +08:00 via Android 1
从 C++到 C#,再 JAVA 和 JS,写久了 JAVA 代码,体会是,代码会越来越精简,预组装越来越多,初始化速度越来越慢,总之猛男也有柔情。JS 则像个软妹子,时不时透出灵动,琢磨不透的美,总还是有读得懂软妹子心的柔情猛男呵!
|
73
hareandlion 2018-04-06 18:39:01 +08:00 via iPhone
写 js 不用 ts 吗
|
74
liuxin5959 OP @hareandlion TS 做不到像真正的强类型语言那样的束缚,再说由于架构问题只能用 Java。
|
75
night98 2018-04-06 18:59:13 +08:00
json to object 插件了解一下。
SpringMVC 可以自动将 JSON 转 Object,大多数时候不需要手动转啊 |
76
ostholz 2018-04-06 19:10:22 +08:00
直接上 Kotlin
|
77
mandy0119 2018-04-06 19:10:40 +08:00
记得加分号
|
78
wee911 2018-04-06 19:12:33 +08:00
原因是你没理解各种数据结构,json 在 js 里当然很简单,其他任何语言都要用库转
|
79
wangxiaoaer 2018-04-06 19:44:31 +08:00
太矫情了,你试没试过 go 这种 xx 一样语言,解析 json 你想死。
|
80
fiht 2018-04-06 20:11:25 +08:00
当年在 vim 下写了半年 C,之后写什么语言都觉得这语言太特么的好用了。
由俭入奢易 由奢入俭难 |
81
jjx 2018-04-06 20:15:15 +08:00
vertx 然后用 js
不过 jvm 上的多语言都有一个问题, 就是最后重心都会偏向 java, 同.net 重心偏向 c#一样, 导致其他语言的支持可能一开始能尽力,到最后只是过场或废弃 从 vertx 的两个 blog, 一个用 babel 支持 es6, 一个用 ts 写 vertx 就可以看出来 //https://vertx.io/blog/vert-x-es6-back-to-the-future/ //https://vertx.io/blog/ecmascript-6-7-on-the-jvm-with-typescript-and-vert-x/ |
82
morning 2018-04-06 20:35:22 +08:00
至少超过 17 位的数字不用转了 233
|
83
anubiskong 2018-04-06 20:44:57 +08:00
你用过 JS 还能忍受 JAVA ?真是个人才
|
84
choulinlin 2018-04-06 20:51:41 +08:00 via Android
@zjsxwc 你搞了几年 java 小弟也是学校学了 java 然后自学 不知看了多少 java 书和网页 就因为还没毕业发现 java 工作机会多 工资高 不过第一份工作一进公司 试用期就转了 php 一开始还不愿意 看不起 php 还想转回 java
直到后来单干了 才发现 php 的好 什么赚钱就什么好 不是取决于技术 而是取决于客户和市场和业务 |
85
hzw94 2018-04-06 21:06:40 +08:00
我也转了 java 在搞,也是一个 json 转化都搞懵逼,只能看 java 同事都代码做
|
86
hotsymbol 2018-04-06 21:12:31 +08:00
那是你不会。C#能救你
|
87
Delete 2018-04-06 22:30:58 +08:00
JSON (JavaScript Object Notation, JS 对象标记)
|
89
rashawn 2018-04-07 01:00:38 +08:00 via iPhone
@kennylam777 这个跟语言没啥关系吧 啥语言都能这么干啊
|
90
wekw 2018-04-07 02:31:08 +08:00
思维转换是很难的,慢慢来吧
|
91
cyspy 2018-04-07 10:43:15 +08:00
主要是 js 可以在 JSON 的几种数据类型之间随便互转,这必然会带来坑,API 设计靠小心一点。静态强类型语言不能互转的,但是当 JSON 结构变化的时候只要改一下模型类就行了,js 要在整个代码里面找哪里用到,坑太大
|
92
xrlin 2018-04-07 21:24:00 +08:00
@murmur 用过 webstorm 写 js,但相比静态类型语言的支持还是太不傻瓜了,和装上插件的编辑器没多大区别。在重构、协作时就可以看出 ts 的用处了,希望 ts、assembly 能早日推广应用。
|
93
zhantss 2018-04-07 22:36:19 +08:00
写几天 TS 适应一下静态类型
然后 JSON 处理的问题,因为 js 本来对 json 就比较友好,所以会有比较大的落差,处理上找个序列化框架就可以啦 Maven 开始会用就行,看个 get started Spring 这算是事实基础了,没办法硬着头皮上吧,不过一般的项目我觉得吧,用的也不是特别深入,把原理和常用的配置注解看一下,写一段时间就熟能生巧了 |
94
print1024 2018-04-08 07:37:18 +08:00
对于 JSON 可以使用 Jackson 或者 阿里的 fastjson
|
95
zjsxwc 2018-04-08 20:56:41 +08:00 via Android
|