/ / TCL Json об'єкт з тире - json, парсинг, tcl

TCL Json об'єкт з дефісом - json, parsing, tcl

використовуючи tcl, може створювати і аналізувати об'єкт json але якщо ім'я елемента містить тире (-), створений рядок більше не розглядається як дійсний об'єкт Json

set jsonStr {{
"Image": {
"Width":  800,
"Height": 600,
"Title":  "View from 15th Floor",
"Thumbnail": {
"Url":    "http://www.example.com/image/481989943",
"Height": 125,
"Width":  100
},
"Animated" : false,
"IDs": [116, 943, 234, 38793],
"valid-access" : [

]
}
} }
set valid_obj [::json:object? $jsonStr ]
puts "is object $valid_obj n"

У цьому випадку valid_obj дорівнює "0". коли я ставить "validaccess" замість "дійсний-доступ", він працює нормально, і я можу розібрати об'єкт json без будь-яких проблем.

що я пропустив? чи є якийсь специфічний режим, який я повинен зробити, щоб прийняти символ "тире" в назві елемента?

Відповіді:

1 для відповіді № 1

Я не знаю, де команда ::json:object? прийшли (можливо тут?), але вона, здається, не є частиною json в Tcllib. Це також неправильно; Ваш об'єкт JSON правильний.

На відміну від цього, якщо я використовую пакет від Tcllib:

package require Tcl 8.6
package require json 1.2
set jsonStr {{
"Image": {
"Width":  800,
"Height": 600,
"Title":  "View from 15th Floor",
"Thumbnail": {
"Url":    "http://www.example.com/image/481989943",
"Height": 125,
"Width":  100
},
"Animated" : false,
"IDs": [116, 943, 234, 38793],
"valid-access" : [

]
}
} }
puts [json::json2dict $jsonStr]

Потім я отримую такий висновок:

Image {Width 800 Height 600 Title {View from 15th Floor} Thumbnail {Url http://www.example.com/image/481989943 Height 125 Width 100} Animated false IDs {116 943 234 38793} valid-access {}}

який виглядає точно правильним для мене.


Насправді, подивившись на цю сторінку Вікі, це вказує на те, звідки ви отримали код. Приклад наочно схожий. [string is wordchar $k] у визначенні object? до [regexp {^[-w]+$} $k]. Хоча це все ще трохи хитрий; Ключі JSON можуть легально містити (майже) будь-який характер. Реальні обмеження пов'язані з тим, як це відбувається json::select на тій же сторінці працює.

Це, наприклад, код, а не виробничий клас.