використовуючи 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
на тій же сторінці працює.
Це, наприклад, код, а не виробничий клас.