【问题标题】:json array parsing in cc语言中的json数组解析
【发布时间】:2013-06-07 03:47:38
【问题描述】:

我正在尝试解析一个 json 数组,我遇到了问题。

我的数组是这样的:

configure: {
  "id": 4,
  "userId": 107,
  "deviceMacAddress": "00:06:66:30:02:3C",
  "medication": [{
    "id": 11,
    "version": 18,
    "name": "name1",
    "unit": "mg",
    "forMed": "for1",
    "schedule": [1]
  }, {
  "id": 45,
  "version": 1,
  "name": "sdga",,
  "unit": "mg",
  "forMed": "54234",
  "schedule": [0,1,2,3,4,5,6]
  }],

我能够访问药物数组并打印总数组,但无法访问数组内的对象。 你能建议任何解决方案或任何例子来使用 C 语言做到这一点吗?

我的代码

int main(int argc, char **argv) {
  struct json_object *med_obj, *medi_obj, *tmp1_obj;
  struct array_list *lArray;
  charname[10] = {0};
  static const char filename[] = "xyz.txt";
  med_obj = json_object_from_file(filename);
  medi_obj = json_object_object_get(med_obj, "medication");
  lArray = json_object_get_array(medi_obj);
  tmp1_obj = json_object_object_get(medi_obj, "name");
  strcpy (name,json_object_to_json_string(tmp1_obj));
  printf("name=%s\n",name);
}

问候, 列宁。

【问题讨论】:

  • 我们能否看看您迄今为止编写的代码,以帮助您就前进的方向提出建议?
  • 这不是有效的 JSON。
  • MyCode: int main(int argc, char *argv){ struct json_objectmed_obj,*medi_obj,*tmp1_obj;结构数组列表 *lArray;字符名[10]={0};静态 const char 文件名 [] = "xyz.txt"; med_obj=json_object_from_file(文件名); medi_obj = json_object_object_get(med_obj, "药物"); lArray=json_object_get_array(medi_obj); tmp1_obj = json_object_object_get(medi_obj,“名称”); strcpy(名称,json_object_to_json_string(tmp1_obj)); printf("name=%s\n",name);
  • 您好,我已经输入了我的代码,您可以检查并提出任何解决方案吗?
  • @Aiias 我已经输入了我的代码,请您检查并提出任何解决方案。

标签: c arrays json parsing


【解决方案1】:

您需要使用json_object * 变量访问内部数组。

试试这个:

struct json_object *med_obj, *medi_array, *medi_array_obj, *medi_array_obj_name;
int arraylen, i;
charname[10] = {0};
static const char filename[] = "xyz.txt";
med_obj = json_object_from_file(filename);
medi_array = json_object_object_get(med_obj, "medication");

// medi_array is an array of objects
arraylen = json_object_array_length(medi_array);

for (i = 0; i < arraylen; i++) {
  // get the i-th object in medi_array
  medi_array_obj = json_object_array_get_idx(medi_array, i);
  // get the name attribute in the i-th object
  medi_array_obj_name = json_object_object_get(medi_array_obj, "name");
  // print out the name attribute
  printf("name=%s\n", json_object_get_string(medi_array_obj_name));
}

【讨论】:

  • 感谢 aiias,它正在工作。每当尝试访问数组中的对象(例如:在我的情况下为名称)时,我都会面临新问题,所有带有名称的值都在打印。我只想要特定的值。可以您请提出任何解决方案。再次感谢您的帮助。
  • 嗨@Aiias 在打印一个对象时(例如:我的数组中的名称)我正在获取所有带有名称的值,我只想打印带有名称标签的某些值。你能提出任何解决方案吗
  • @leninT.mohan - 你得到all the values with name是什么意思?目前我们正在遍历数组。如果您只想要数组中的第一个对象,请不要使用 for 循环,而只需执行 medi_array_obj = json_object_array_get_idx(medi_array, 0);
  • 嗨@Aiias我想要所有的对象值,但我必须在不同的行中打印每个值(即第1行中的“名称”=1,第二行数组中的对象“名称”下一次出现等等最多 10 次)。现在,当我打印时,它们打印在一行中。我怎样才能以相同的方式读取所有对象并打印它们?请检查我之前帖子中的代码。谢谢你的回复
  • @leninT.mohan - 你是说printf("name = %s \n", json_object_get_string(medi_array_obj_name)); 不会打印出多行吗? "\n" 换行符应该换行到下一行。尝试在=\n 之间添加一个空格。
【解决方案2】:

您可以使用 jsoncpp 来完成这项工作。 数组作为Json::Value,可以

medicationValue = jsonObject[medicationKey];
Json::Value::Members member;
member = medicationValue .getMemberNames();

for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++) {
    the element of medication here
}

希望对你有帮助。

【讨论】:

    【解决方案3】:

    如果要将数组作为 json 对象访问,则应将其作为 json_object* 而不是 array_list* 获取

    struct json_object *lArray; 
    ...
    lArray=json_object_get(medi_obj); 
    tmp1_obj = json_object_object_get(json_object_array_get_idx(lArray, 0), "name");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多