luaモジュールのcjsonモジュール-json解析

9267 ワード

lua jsonの解析とコンパイル
リファレンス
  • lua-cjson-manual
  • lua-cjson

  • 概要(Synopsis)
    local cjson = require "cjson"
    -- Module instantiation
    --      
    local cjson2 = cjson.new()
    local cjson_safe = require "cjson.safe"
    
    -- Translate Lua value to/from JSON
    text = cjson.encode(value)
    value = cjson.decode(text)
    
    -- Get and/or set Lua CJSON configuration
    setting = cjson.decode_invalid_numbers([setting])
    setting = cjson.encode_invalid_numbers([setting])
    keep = cjson.encode_keep_buffer([keep])
    depth = cjson.encode_max_depth([depth])
    depth = cjson.decode_max_depth([depth])
    convert, ratio, safe = cjson.encode_sparse_array([convert[, ratio[, safe]]])

    モジュールインスタンス化(Module Instantiation)
    local cjson = require "cjson"
    local cjson2 = cjson.new()
    local cjson_safe = require "cjson.safe"
  • cjson復号/符号化時に不正なデータに遭遇するとエラー
  • が投げ出す.
  • cjson_safecjsonと同様であるが、不正なデータに遭遇した場合には、エラーを投げ出すことなくnilerrorに戻る.
  • cjson.new()は、独自の符号化バッファとデフォルト設定を有するインスタンスを作成する.

  • 解析json文字列(decode)
    value = cjson.decode(json_text)
  • UTF-16およびUTF-32は、
  • をサポートしていません.
    json_text = '[ true, { "foo": "bar" } ]'
    value = cjson.decode(json_text)
    -- Returns: { true, { foo = "bar" } }

    使用できない数字を復号する(decode_invalid_numbers)
    setting = cjson.decode_invalid_numbers([setting])
    -- "setting" must be a boolean. Default: true.
  • json仕様でサポートされていない数字を解析しようとすると、次のようにエラーが発生します.
  • infinity
  • not-a-number(NaN)
  • hexadecimal

  • で使用可能な設定:
  • true:使用できない数値が解析されます.デフォルトは
  • です.
  • false:使用できない数字に遭遇すると
  • とエラーが発生します.

    このメソッドは呼び出すと現在の設定値を返す.
    local in = cjson.decode_invalid_numbers(false)
    --in is false

    json文字列最大解析深さ(decode_max_depth)
    depth = cjson.decode_max_depth([depth])
    -- "depth" must be a positive integer. Default: 1000.
  • json文字列の最大埋め込み深さを設定し、この深さを超えるとエラーが投げ出され、スタックオーバーフローを防止する
  • .
  • の既定の深さは1000です.

  • エンコーディング
    json_text = cjson.encode(value)
  • は、次のタイプのjson列への変換をサポートします.
  • boolean
  • nil
  • number
  • string
  • table
  • lightuserdata(null value only)

  • 残りは間違いを報告します.
  • function
  • lightuserdata(not null value)
  • thread
  • userdata

  • デフォルト値は、14ビット精度
  • を保持します.
  • 次の文字列に遭遇すると、エスケープされます.
  • 制御文字
  • 二重引用符
  • スラッシュおよび反スラッシュ
  • 削除記号
  • 次の状況に遭遇すると、エラーが発生します.
  • json仕様に適合しない数字(infinity,NaN)
  • 表ネスト1000層を超える
  • 過剰疎lua配列
  • value = { true, { foo = "bar" } }
    json_text = cjson.encode(value)
    -- Returns: '[true,{"foo":"bar"}]'

    エンコーディング設定
  • encode_invalid_numbers
  • true:符号化不可の値を許可する.
  • null:Null値
  • として生成
  • false:エラー
  • encode_keep_buffer
  • true:キャッシュ符号化コンテンツ
  • false:
  • をキャッシュしない
  • encode_max_depth
  • depth:数値、符号化最大ネスト深さ、デフォルト1000
  • encode_number_precision
  • デジタル符号化精度:1-14、デフォルト14
  • encode_sparse_array
    cjson.encode({ [3] = "data" })
    -- Returns: '[null,null,"data"]'

    cjson.encode_sparse_array(true)
    cjson.encode({ [1000] = "excessively sparse" })
    -- Returns: '{"1000":"excessively sparse"}'

  • 変数#ヘンスウ#
    null
    json文字列のnull値を解析するとcjsonとして解析する.null.判断時if value == cjson.null then ... endlua_cjsonモジュールで使用可能なメソッドと変数
  • cjson.encode_empty_table_as_object(true|false|"on"|"off")のデフォルトはtrueで、空のluaテーブルは空のjsonオブジェクト{}に符号化され、falseに設定とjson配列[]
  • に符号化される.
  • cjson.empty_array lightuserdata cjson.nullと同様に、この値は空のjson配列[]
  • に符号化される.
    local cjson = require "cjson"
    
    local json = cjson.encode({
        foo = "bar",
        some_object = {},
        some_array = cjson.empty_array
    })

    json列が生成されます.
    {
        "foo": "bar",
        "some_object": {},
        "some_array": []
    }
  • setmetatable({}, cjson.array_mt)テーブルはjsonの配列
  • を生成する.
    local t = { "hello", "world" }
    setmetatable(t, cjson.array_mt)
    cjson.encode(t) -- ["hello","world"]

    生成:
    local t = {}
    t[1] = "one"
    t[2] = "two"
    t[4] = "three"
    t.foo = "bar"
    setmetatable(t, cjson.array_mt)
    cjson.encode(t) -- ["one","two",null,"three"]
  • setmetatable({}, cjson.empty_array_mt)は、テーブルを識別するために使用され、テーブルが空の場合、json配列が生成されます(無視されます).次の2つの場合は同じです.
  • local function serialize(arr)
        if #arr < 1 then
            arr = cjson.empty_array
        end
    
        return cjson.encode({some_array = arr})
    end

    上と同じ:
    local function serialize(arr)
        setmetatable(arr, cjson.empty_array_mt)
    
        return cjson.encode({some_array = arr})
    end

    最終的な結果は次のとおりです.
    {
        "some_array": []
    }
  • encode_number_precision cjsonデフォルト1-14ビットが修正する、ここでは1-16ビットとすることができる.