แปลง multiple JSON object string ด้วย Python

สมมติว่าเรามี JSON object หลายๆ ตัวซ้อนกันอยู่ใน string แบบนี้ (multi line ด้วยอ่ะ ไม่งั้นล้นหน้า page wordpress)

json_string = = """
{"ID":1,"Key":{"Name":"A", "Surname":"A1"},"Pets":["Cat","Dog"]},
{"ID":9,"Key":{"Name":"Z", "Surname":"Z3"},"Pets":["Fish"]}
"""

ถ้าเรา convert มันให้กลายเป็น JSON object (จริงๆ คือ Python dict object) ด้วย json.loads(string) ตรงๆ ผลลัพท์ที่ได้จะบึ้มดังนี้

import json

json_string = = """
{"ID":1,"Key":{"Name":"A", "Surname":"A1"},"Pets":["Cat","Dog"]},
{"ID":9,"Key":{"Name":"Z", "Surname":"Z3"},"Pets":["Fish"]}
"""

json_obj = json.loads(json_string)

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "...\lib\json\__init__.py", line 354, in load
s
    return _default_decoder.decode(s)
  File "...\lib\json\decoder.py", line 342, in decod
e
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 65 (char 64)

ทางแก้คือเราต้องทำให้ string ก้อนนั้นเป็น JSON array แล้วเราจะได้ array ของ JSON object มาวนแต่ละตัวได้

import json

json_string = """
[
    {"ID":1,"Key":{"Name":"A", "Surname":"A1"},"Pets":["Cat","Dog"]},
    {"ID":9,"Key":{"Name":"Z", "Surname":"Z3"},"Pets":["Fish"]}
]
"""

json_obj = json.loads(json_string)

print(json_obj[0])
>>> {'ID': 1, 'Key': {'Name': 'A', 'Surname': 'A1'}, 'Pets': ['Cat', 'Dog']}

print(json_obj2[1])
>>> {'ID': 9, 'Key': {'Name': 'Z', 'Surname': 'Z3'}, 'Pets': ['Fish']}

ป.ล. string ถ้าไม่ multi lines ก็ใช้วิธีเดียวกันนั่นแหละ

ป.ล. 2 เพิ่งเห็นว่าเจ้า Gutenberg editor นี่ช่องให้ code ไม่มีรองรับ code syntax, formatting โคตรกากกกกกก ห่วยกว่าเก่าอีก

Quick Note: TypeScript

เพิ่งเจอลูกค้าใช้ภาษา TypeScript (Wiki) เห็นว่าน่าสนใจเลยลองศึกษาดูสักพักล่ะ

  • มันเป็นภาษา Super Set ของ JavaScript ที่คิดค้นโดยเทพ Anders Hejlsberg
  • เพราะว่า JS มันโคตร flexible จนเราเขียนให้มันผิดพลาดได้ง่ายๆ TypeScript ก็เลยแก้ปัญหาด้วยการเพิ่มความเป็น Static Type, Scope, Class-based OOP เข้าไปใน ECMAScript syntax แล้ว compile ออกมาเป็น JS หรือ ECMAScript ver ต่างๆ ได้เลย ปัญหาพวก type ก็ detect กันตอน compile นี่แหละ
  • เพราะมันเป็น Super Set ของ JS ดังนั้นเราเขียน JS ใส่มันไปดื้อๆ ก็ compile ผ่าน
  • ถ้าทำงานกับทั้งภาษา Dynamic กับ Static Type พร้อมๆ กันแล้วจะรู้สึกว่ามันเป็นธรรมชาติมาก ดูไม่ฝืนความเป็น JS แต่ถ้าทำงานกับภาษา Dynamic ล้วนน่าจะชอบ CoffeeScript มากกว่า
  • โดยรวมทำให้เขียน code ช้าลงนิดนึง แต่ได้ความมั่นใจเรื่อง type, การเขียน class แบบที่คุ้นเคยมา
  • ข้อเสียคือเวลาทำงานกับ JS library อื่นๆ มันต้องการ file definition (.ts.d หรือ typing) ที่ระบุ structure ของ function, class, type, module ของ library นั้นๆ เพื่อให้มัน compile ผ่าน (อารมณ์ .h ของภาษา C)
  • ถ้าเป็น lib ดังๆ แบบ jQuery, Angular, React พวกนี้มีคนทำ file พวกนี้ให้อยู่แล้ว แต่คำถามที่สำคัญคือบางคนทำ file พวกนี้ก็ไม่ใช้คนที่เขียน lib นั้น ดังนั้นก็ต้องดูกันยาวๆ ว่าจะไล่แก้ file definition ตาม update ได้ตลอดไหม
  • ถ้าเป็น lib internal (หรือ legacy) lib เนี่ยยากสุดๆ ที่จะมีเจ้า file นี้หรือเขียน file นี้้ย้อนหลัง ขนาดจะลองกะ JS API ตัวเองยังต้องไปเอา file นี้จากลูกค้า (ซึ่ง decompile API ผมออกมาเขียนไอ้ file นี้) มาใช้เลย
  • ส่วนตัวคิดว่าถ้าเป็น Project ใหม่ + ใช้ lib ที่สนับสนุน TypeScript (เช่น Angular 2) หรือ lib ที่เราเขียนใหม่เองก็น่าสนใจที่จะใช้มัน
  • แต่ถ้าทำงานกับ legacy lib เยอะๆ ก็… ตัวใครตัวมัน

ป.ล. กำลังหัดอยู่จาก link TypeScript Tutorial เข้าใจง่ายดี

ผมเรียน JavaScript อย่างไร

4 ปีที่แล้ว project ที่ผมทำมีการเปลี่ยนแปลงครั้งใหญ่คือเปลี่ยนจาก Java Applet มาเป็น JavaScript Ajax API ตามก้นชาวบ้านชาวช่องที่เลิกเขียน Applet กันไปเป็นปีๆ แล้ว

การเปลี่ยนครั้งนั้นนับว่าครั้งใหญ่เพราะทุกคนทั้ง dev, qa และ support ไม่มีใครรู้ JavaScript หรือ Ajax เลย ทาง dev และ qa นั้นนำร่องไปก่อนอยู่หลายเดือนกว่าที่ผมจะมีเวลาว่างไปศึกษามัน blog นี้ก็จะมาเล่าให้ฟังว่าผมศึกษา JavaScript ผ่านทาง API ตัวนั้นยังไง

  1. dev ให้ source code ของ api และ test page (version beta ทั้งคู่) มา
  2. qa สอนผมลง ajax server (เขียนด้วย c++), วิธี set environment ต่างๆ
  3. dev บอกผมว่าให้ใช้ firebug (สมัยนั้นยังไม่ support chrome) จับ network มาดู message ที่วิ่งระหว่าง server และ client
  4. ผมอ่าน source code, ลอง debug ทีละบรรทัดด้วย firebug และลองใช้ console.log ไล่ flow ของ code
  5. ผมลองแก้ code ต่างๆ เพื่อดูว่ามันจะทำงานยังไง
  6. syntax ไหนไม่เข้าใจว่าทำไม dev เขียนแบบนี้ก็ลอง google ดู ถ้ายังไม่เข้าใจก็ถาม dev ว่าทำไมเขียนแบบนี้ (วะ)
  7. พอ api ออก version production dev ก็สอนผมใช้เวบ jsbeautifier เพื่อ decomplie minify code

ส่วนพวก business logic ต่างๆ (ไม่เกี่ยวกับ syntax code) ส่วนใหญ่ก็ถาม dev เอาครับ มีบ้างที่มันซับซ้อนจน dev/qa ต้องทำเป็น powerpoint สอนทั้งทีมเลยก็มี

หลักๆ จะเห็นว่าวิธีการคือมีคนโยน code มาให้ –> ลองเล่น –> สงสัยก็ถาม มาตั้งแต่ version beta วิธีการนี้คงทำให้ผมพอที่จะเขียน code และแก้ไขปัญหาลูกค้าที่ใช้ JavaScript API ตัวนี้ได้ แต่ถามว่าเข้าใจ JavaScript ลึกๆ ไหม ก็ต้องตอบว่าไม่เลยครับ – -”

ถาม: ทำไมไม่เขียน CoffeeScript ครับ
ตอบ: ควย Code ที่ dev เขียนและลูกค้าใช้งานเป็น JavaScript เฟ้ย