You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:47:07