简体   繁体   中英

How to extract parrticular value from nested json values.?

I am new to python.

I have small requirement (ie) want to extract only one value from the JSON format.

Please do correct me if i am wrong.

JSON input is:

{
  "meta": {
    "limit": 1,
    "next": "/api/v1/ips/?username=sic1&api_key=689db0740ed73c2bf6402a7de0fcf2d7b57111ca&limit=1&objects=&offset=1",
    "offset": 0,
    "previous": null,
    "total_count": 56714
  },
  "objects": [
    {
      "_id": "556f4c81dcddec0c41463529",
      "bucket_list": [],
      "campaign": [
        {
          "analyst": "prabhu",
          "confidence": "medium",
          "date": "2015-06-03 14:50:41.440000",
          "name": "Combine"
        }
      ],
      "created": "2015-06-03 14:50:41.436000",
      "ip": "85.26.162.70",
      "locations": [],
      "modified": "2015-06-18 09:50:51.612000",
      "objects": [],
      "relationships": [
        {
          "analyst": "prabhu",
          "date": "2015-06-18 09:50:51.369000",
          "rel_confidence": "unknown",
          "rel_reason": "N/A",
          "relationship": "Related_To",
          "relationship_date": "2015-06-18 09:50:51.369000",
          "type": "Indicator",
          "value": "556f4c81dcddec0c4146353a"
        }
      ],
      "releasability": [],
      "schema_version": 3,
      "screenshots": [],
      "sectors": [],
      "source": [
        {
          "instances": [
            {
              "analyst": "prabhu",
              "date": "2015-06-03 14:50:41.438000",
              "method": "trawl",
              "reference": "http://www.openbl.org/lists/base_30days.txt"
            }
          ],
          "name": "www.openbl.org"
        }
      ],
      "status": "New",
      "tickets": [],
      "type": "Address - ipv4-addr"
    }
  ]
}

The code i used for getting value only IP's from objects

import requests
from pprint import pprint
import json
url = 'http://127.0.0.1:8080/api/v1/ips/'
params = {'api_key':'xxxxxx','username': 'abcd'}
r = requests.get(url, params=params, verify=False)
parsed = json.loads(r)
print (parsed['objects']['ip'])

The error i am receiving is:

Traceback (most recent call last):
  File "testapi.py", line 9, in <module>
    parsed = json.loads(r)
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

I just want to get IP's from that JSON input.

Thanks.

You are passing a requests object instead of a str object to json.loads() . You need to change

parsed = json.loads(r)

to

parsed = json.loads(r.text)

Also, parsed['objects'] is a list, you need to access its first element & then get the key ip :

>>> print(parsed['objects'][0]['ip'])

The problem is in this line: parsed = json.loads(r)

You're reciving the json response but insted of feeding json elements to json.loads you're instead feeding it <Response [200]>

    >>> r = requests.get('http://www.google.com')
    >>> r
    <Response [200]>
    >>> type(r)
    <class 'requests.models.Response'>

(Look closely at the error message. Expected string or buffer Which means you're providing it something that is NOT string or buffer(an object in this case))
This is the reason why str(r) didn't work. Because it just converted <Response 200> to '<Response 200>' which obviously is not json.


change this line to parsed = json.loads(r.text) .

   >>> type(r.text)
   <type 'unicode'>

and then parsed['objects'][0]['ip'] should give you the IP address :)
You can find more about the requests module here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM