【问题标题】:How to parse such a json array?如何解析这样的json数组?
【发布时间】:2016-02-16 09:55:44
【问题描述】:

我在尝试解析以下 json 数组时遇到了困难。如何解析它。网络上的其他答案似乎无法解决我的问题。

{
  "status": 1,
  "value": {
    "details": [
      {
        "shipment_ref_no": "32",
        "point_of_contact": {
          "empid": ""
        },
        "products": {
          "0": " Pizza"
        },"status": "2"
      },
      {
        "shipment_ref_no": "VAPL/EXP/46/14-15",
        "point_of_contact": {
          "empid": "60162000009888"
        },
        "products": {
          "0": "MAIZE/CORN STARCH"
        },
        "status": "5"
      }
    ]
  }
}

我必须访问每个键的值。

以下是我的代码

NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
NSArray *argsArray = [[NSArray alloc] initWithArray:[jsonDic objectForKey:@"details"]];
NSDictionary *argsDict = [[NSDictionary alloc] initWithDictionary:[argsArray objectAtIndex:0]];
NSLog(@"keys = %@", jsonDic[@"values"]);

【问题讨论】:

  • 展示你编写的代码
  • 为什么不使用第三方库/pod 来帮助您进行解析?
  • 尝试用我提供的代码替换您的代码。

标签: ios objective-c json


【解决方案1】:

这是解析整个字典的方法:

NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    NSArray *details = [[dataDictionary objectForKey:@"value"] objectForKey:@"details"];

    for (NSDictionary *dic in details) {
        NSString *shipmentRefNo = dic[@"shipment_ref_no"];
        NSDictionary *pointOfContact = dic[@"point_of_contact"];
        NSString *empId = pointOfContact[@"empid"];

        NSDictionary *products = dic[@"products"];
        NSString *zero = products[@"0"];
        NSString *status = dic[@"status"];

    }

【讨论】:

    【解决方案2】:
    NSString *pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    
    NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];    
    NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
    NSArray *argsArray = [[NSArray alloc] initWithArray:[jsonDic objectForKey:@"details"]];
    
    //argsArray holds objects in form of NSDictionary.
    for(NSDictionary *response in argsArray) {
       //String object
        NSLog(@"%@", [response valueForKey:@"shipment_ref_no"]);
       //Dictionary object
        NSLog(@"%@", [[response objectForKey:@"point_of_contact"] valueForKey:@"empid"]);
       //String object
        NSLog(@"%@", [response valueForKey:@"status"]);
       //Dictionary object
        NSLog(@"%@", [[response objectForKey:@"products"] valueForKey:@"0"]);
    }
    

    我相信您一定应该要求您的服务器开发人员更新响应格式。

    此外,您始终可以使用模型类来解析数据。请检查这个,How to convert NSDictionary to custom object

    是的,我正在使用this 站点来检查我的 json 响应。

    【讨论】:

      【解决方案3】:

      编辑:以下答案在 javascript 中!

      您可以使用以下方式解析您的 json 数据:

      var array = JSON.parse(data);
      

      然后你可以得到这样的一切:

      var refno = array["value"]["details"][0]["shipment_ref_no"];
      

      【讨论】:

      • value 不是给定示例中的数组。
      • 好的,谢谢。但它认为他想知道如何在 javascript 中做到这一点,所以无论如何我的回答都是错误的
      【解决方案4】:

      你可以像...一样解析

      NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
      NSDictionary *dictValue = [[NSDictionary alloc] initWithDictionary:[jsonDic objectForKey:@"value"]];
      
      NSArray *arrDetails = [[NSArray alloc] initWithArray:[dictValue objectForKey:@"details"]];
      
      for (int i=0; i<arrDetails.count; i++) 
      {
          NSDictionary *dictDetails=[arrDetails objectAtIndex:i];
          NSDictionary *dictContact = [[NSDictionary alloc] initWithDictionary:[dictDetails objectForKey:@"point_of_contact"]];
          NSDictionary *dictProduct = [[NSDictionary alloc] initWithDictionary:[dictDetails objectForKey:@"products"]];
      }
      

      【讨论】:

        【解决方案5】:
        NSDictionary *response = //Your json
        NSArray *details = response[@"value"][@"details"]
        

        等等。很简单

        【讨论】:

          【解决方案6】:

          如下更新您的代码。您正在尝试从顶层读取 details 数组,而在您的数据中它位于 value 键内。因此,您应该读取值 dict 并在其中读取详细信息数组。

          NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
          NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];
          NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
          NSDictionary *valueDict = [jsonDic objectForKey:@"value"];
          NSArray *argsArray = [[NSArray alloc] initWithArray:[valueDict objectForKey:@"details"]];
          NSDictionary *argsDict = [[NSDictionary alloc] initWithDictionary:[argsArray objectAtIndex:0]];
          NSLog(@"keys = %@", jsonDic[@"values"]);
          

          【讨论】:

            【解决方案7】:

            我认为你的问题是你有:

            NSLog(@"keys = %@", jsonDic[@"values"]);
            

            但应该是:

            NSLog(@"keys = %@", jsonDic[@"value"]);
            

            【讨论】:

              【解决方案8】:

              下面是解析 JSON 数组的代码。我曾经从文件中解析 JSON 数组,但您也可以使用响应链接来执行此操作。我已经为两者提供了代码,如下所示。

              // using file
              NSString *str = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
              NSData *data = [[NSData alloc]initWithContentsOfFile:str];
              NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
              NSMutableDictionary *dictValues = [[NSMutableDictionary alloc]initWithDictionary:[dict valueForKey:@"value"]];
              NSMutableArray *array = [[NSMutableArray alloc]initWithArray:[dictValues valueForKey:@"details"] copyItems:YES];
              
              NSLog(@"Array Details :- %@",array);
              
              // using url
              NSURL *url = [NSURL URLWithString:@"www.xyz.com"]; // your url
              NSData *data = [[NSData alloc]initWithContentsOfURL:url];
              NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
              NSMutableDictionary *dictValues = [[NSMutableDictionary alloc]initWithDictionary:[dict valueForKey:@"value"]];
              NSMutableArray *array = [[NSMutableArray alloc]initWithArray:[dictValues valueForKey:@"details"] copyItems:YES];
              
              NSLog(@"Array Details :- %@",array);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-12-06
                • 1970-01-01
                • 2019-04-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-10-22
                • 2017-04-12
                相关资源
                最近更新 更多