Try lua json
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 05972cf..e0ff8c0 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -48,7 +48,7 @@
       - name: 'Install Dependencies'
         run: |
           sudo luarocks install luaunit
-          sudo luarocks install lua-cjson 2.1.0-1
+          sudo luarocks install lua-cjson
       - name: 'Run Tests'
         run: |
           cd lib/skywalking
diff --git a/lib/skywalking/segment.lua b/lib/skywalking/segment.lua
index 3249c24..ea870e4 100644
--- a/lib/skywalking/segment.lua
+++ b/lib/skywalking/segment.lua
@@ -17,8 +17,7 @@
 
 -- Segment represents a finished tracing context
 -- Including all information to send to the SkyWalking OAP server.
-
-local cjson = require("cjson")
+local Util = require('util')
 
 local Segment = {
     trace_id,
@@ -33,6 +32,8 @@
 -- Following SkyWalking official trace protocol v2
 -- https://github.com/apache/skywalking-data-collect-protocol/blob/master/language-agent-v2/trace.proto
 local SegmentProtocol = {
+    globalTraceIds,
+    traceSegmentId,
     serviceId,
     serviceInstanceId,
     spans,
@@ -46,9 +47,32 @@
     return o
 end
 
--- Transform the segment object to the 
+function SegmentProtocol:new()
+    local o = {}
+    setmetatable(o, self)
+    self.__index = self
+
+    o.globalTraceIds = {}
+
+    return o
+end
+
+-- Return SegmentProtocol
 function Segment:transform()
-    return cjson.encode(self)
+    local segmentBuilder = SegmentProtocol:new()
+    segmentBuilder.serviceId = self.service_id
+    segmentBuilder.globalTraceIds[1] = Util:id2String(self.trace_id)
+    segmentBuilder.traceSegmentId = Util:id2String(self.segment_id)
+    segmentBuilder.serviceId = self.service_id
+    segmentBuilder.serviceInstanceId = self.service_inst_id
+
+    segmentBuilder.spans = {}
+    for i, span in ipairs(self.spans)
+    do 
+        segmentBuilder.spans[#segmentBuilder.spans + 1] = span:transform()
+    end
+
+    return segmentBuilder
 end
 
 return Segment
\ No newline at end of file
diff --git a/lib/skywalking/span_test.lua b/lib/skywalking/span_test.lua
index 5ed2ffa..a2265e0 100644
--- a/lib/skywalking/span_test.lua
+++ b/lib/skywalking/span_test.lua
@@ -19,7 +19,6 @@
 local TC = require('tracing_context')
 local Span = require('span')
 local SpanLayer = require("span_layer")
-local cjson = require("cjson")
 
 TestSpan = {}
     function TestSpan:testNewEntry()
@@ -142,10 +141,6 @@
         lu.assertEquals(#spanBuilder.logs, 1)
         lu.assertEquals(spanBuilder.logs[1].data["logkey"], "logvalue")
         lu.assertEquals(spanBuilder.logs[1].data["logkey1"], "logvalue2")
-
-        local inJSON = cjson.encode(spanBuilder)
-        lu.assertTrue(string.len(inJSON) > 0)
-        -- print(inJSON)
     end
 -- end TestSpan
 
diff --git a/lib/skywalking/tracing_context_test.lua b/lib/skywalking/tracing_context_test.lua
index 63b47ad..d0c0dd1 100644
--- a/lib/skywalking/tracing_context_test.lua
+++ b/lib/skywalking/tracing_context_test.lua
@@ -69,6 +69,8 @@
         local isSegmentFinished, segment = context:drainAfterFinished()
         lu.assertEquals(span2, segment.spans[1])
         lu.assertEquals(span1, segment.spans[2])
+
+        local segmentBuilder = segment:transform()
     end
 
     function TestTracingContext:testNewNoOP()