如何在Ada中通过GNATCOLL.JSON访问JSON数组的指定位置?
用GNATCOLL.JSON访问数组指定位置元素的方法
嘿,我刚好有过用GNATCOLL.JSON处理数组的经验,给你捋捋怎么实现你想要的类似integer = Test(2)的数组索引访问功能!
首先得明确GNATCOLL.JSON的数组操作逻辑:它的数组类型是JSON_Array,默认使用1-based索引(也就是第一个元素索引是1,而不是0),所以你要访问原数组中0-based的索引2,得对应转成1-based的索引3。
完整代码示例
with GNATCOLL.JSON; use GNATCOLL.JSON; with Ada.Text_IO; use Ada.Text_IO; procedure JSON_Array_Demo is -- 你的JSON结构对应的字符串 Raw_JSON : constant String := "{ ""Test"": [ 0, 1, 2, 3, 4 ] }"; -- 解析后的根JSON对象 Root : JSON_Value; -- 存储"Test"对应的数组 Test_Array : JSON_Array; -- 存储最终取出的整数 Target_Int : Integer; begin -- 第一步:解析JSON字符串得到根对象 Root := Read (Raw_JSON); -- 第二步:从根对象中提取名为"Test"的数组 Test_Array := Get (Root, "Test"); -- 第三步:访问指定位置的元素并转换为整数 -- 原数组0-based索引2 → GNATCOLL 1-based索引3 Target_Int := Get (Get (Test_Array, 3)); -- 验证结果(应该输出2) Put_Line ("Test(2) 对应的整数是: " & Integer'Image(Target_Int)); exception when JSON_Error => Put_Line ("错误:JSON格式错误、数组索引越界或""Test""不是数组类型"); end JSON_Array_Demo;
简化成你想要的写法
如果你习惯0-based索引,可以自己封装一个小函数,让访问方式更贴近你想要的Test(2):
function Get_0_Based (Arr : JSON_Array; Index : Natural) return JSON_Value is begin -- 把0-based索引转成GNATCOLL需要的1-based return Get (Arr, Index + 1); end Get_0_Based;
之后就可以这样用:
Target_Int := Get (Get_0_Based (Test_Array, 2));
关键注意点
- 一定要确认
"Test"对应的是数组类型,否则调用Get(Root, "Test")会抛出JSON_Error异常。 - 索引越界也会触发
JSON_Error,所以如果需要健壮性,记得加上异常处理逻辑。
内容的提问来源于stack exchange,提问作者Yorch
相关产品推荐
相关产品推荐

