从JSON文件访问数据

时间:2016-09-23 18:07:23

标签: python json extract

我对JSON很新。我的代码在于从需要API密钥的网站中提取数据。提取了信息。我试图通过这种格式(这里是一个样本)来获取儿子编码的信息:

[{"number":31705,"name":"31705 - CHAMPEAUX (BAGNOLET)","address":"RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET","latitude":48.8645278209514,"longitude":2.416170724425901},{"number":10042,"name":"10042 - POISSONNIÈRE - ENGHIEN","address":"52 RUE D'ENGHIEN / ANGLE RUE DU FAUBOURG POISSONIERE - 75010 PARIS","latitude":48.87242006305313,"longitude":2.348395236282807}]

如何访问json代码中的不同数据?这是我提出的代码:

import requests

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{station_number}?contract={contract_name}&api_key HTTP/1.1')

我相信我的请求已经制定了一个回复,该回复位于网站发送到我的计算机的“响应”“文件夹”中:

print(reponse.headers)
print(reponse(2,/'latitude')

我试图访问json代码的每个元素中的lattitude信息 - 2代表列表的第二个元素,并且我想要在json列表的元素中访问的值的名称。但我无法做到这一点。我得到的错误是语法错误。

我该如何解决?我想访问对象'response'的每个成员的每个字符串的所有值。

更新n°1:

我的新代码是:

import json
import requests
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0}  HTTP/1.1')
data = json.loads(response.content)
print(data)

然而我收到错误:

Traceback (most recent call last):
  File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 27, in <module>
data = json.loads(response.content)
  File "/Users/someone/miniconda3/lib/python3.5/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'

更新n°2:

我的新代码是:

import json
import requests
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0}  HTTP/1.1')
data = response.json()
latitude = data[2]['latitude']

然而我收到错误:

Traceback (most recent call last):
File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 30, in <module>
latitude = data[2]['latitude']
KeyError: 2

这是否意味着响应是空的?

更新n°3:

reponse.content

答案如下:

b'{ "error" : "Unauthorized" }'

有什么问题?

更新n°4:

我的新代码是:

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0}  HTTP/1.1')

data =  json.loads(response.content.decode('utf-8'))
print(reponse.headers)
print(reponse.content)

结果是:

{'Content-Length': '48', 'Content-Encoding': 'gzip', 'Server': 'Apache-Coyote/1.1', 'Date': 'Fri, 23 Sep 2016 19:39:25 GMT', 'Connection': 'close', 'Content-Type': 'application/json'}
b'{ "error" : "Unauthorized" }'

所以我的请求的答案不是空的,但我没有授权访问它。我该如何解决这个问题?

最终更新:

新的和有效的代码是:

import json

import requests

r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0')

response_json = r.json()

print (response_json['name'])

结果是:

31705 - CHAMPEAUX (BAGNOLET)

3 个答案:

答案 0 :(得分:1)

您可以将public class TexturedLightCube { /** Cube vertices */ private static final float VERTICES[] = { -0.3f, -0.3f, -0.3f, //top front right 0.3f, -0.3f, -0.3f, //bottom front right 0.3f, 0.3f, -0.3f, //bottom front left -0.3f, 0.3f, -0.3f, //top front left -0.3f, -0.3f, 0.3f, //top back right 0.3f, -0.3f, 0.3f, //bottom back right 0.3f, 0.3f, 0.3f, //bottom back left -0.3f, 0.3f, 0.3f // top back left }; /** Vertex colors. */ private static final float COLORS[] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, }; /** Order to draw vertices as triangles. */ private static final byte INDICES[] = { 0, 1, 3, 3, 1, 2, // Front face. 0, 1, 4, 4, 5, 1, // Bottom face. 1, 2, 5, 5, 6, 2, // Right face. 2, 3, 6, 6, 7, 3, // Top face. 3, 7, 4, 4, 3, 0, // Left face. 4, 5, 7, 7, 6, 5, // Rear face. }; private static final float TEXTURECOORDS[] = { 0.0f, 1.0f, //left-bottom 0.0f, 0.0f, //right bottom 1.0f, 0.0f, //left top 1.0f, 1.0f, //right top 0.0f, 1.0f, //left-bottom 0.0f, 0.0f, //right bottom 1.0f, 0.0f, //left top 1.0f, 1.0f, //right top }; private static final float NORMALS[] = { //set all normals to all light for testing 1.0f, 1.0f, 1.0f, //top front right 1.0f, 0.0f, 1.0f, //bottom front right 0.0f, 0.0f, 1.0f, //bottom front left 0.0f, 1.0f, 1.0f, //top front left 1.0f, 1.0f, 0.0f, //top back right 1.0f, 0.0f, 0.0f, //bottom back right 0.0f, 0.0f, 0.0f, //bottom back left 0.0f, 1.0f, 0.0f //top back left }; static final int COORDS_PER_VERTEX = 3; private static final int VALUES_PER_COLOR = 4; /** Vertex size in bytes. */ final int VERTEX_STRIDE = COORDS_PER_VERTEX * 4; /** Color size in bytes. */ private final int COLOR_STRIDE = VALUES_PER_COLOR * 4; /** Shader code for the vertex. */ private static final String VERTEX_SHADER_CODE = "uniform mat4 uMVPMatrix;" + "uniform mat4 uMVMatrix;" + "uniform vec3 u_LightPos;" + "attribute vec4 vPosition;" + "attribute vec4 a_Color;" + "attribute vec3 a_Normal;" + "varying vec4 v_Color;" + "attribute vec2 a_TexCoordinate;" + "varying vec2 v_TexCoordinate;" + "void main() {" + "vec3 modelViewVertex = vec3(uMVMatrix * vPosition);"+ "vec3 modelViewNormal = vec3(uMVMatrix * vec4(a_Normal, 0.0));" + "float distance = length(u_LightPos - modelViewVertex);" + "vec3 lightVector = normalize(u_LightPos - modelViewVertex);" + "float diffuse = max(dot(modelViewNormal, lightVector), 0.1);" + "diffuse = diffuse * (1.0/(1.0 + (0.00000000000002 * distance * distance)));" + //attenuation factor "v_Color = a_Color * a_Color * diffuse;" + "gl_Position = uMVPMatrix * vPosition;" + "v_TexCoordinate = a_TexCoordinate;" + "}"; /** Shader code for the fragment. */ private static final String FRAGMENT_SHADER_CODE = "precision mediump float;" + "varying vec4 v_Color;" + "uniform sampler2D u_Texture;"+ //The input texture "varying vec2 v_TexCoordinate;" + "void main() {" + " gl_FragColor = v_Color * texture2D(u_Texture, v_TexCoordinate) ;" + //still works with just color "}"; private int mTextureUniformHandle; //Pass in texture. private int mTextureCoordinateHandle; //Pass in model texture coordinate information. private final int mTextureCoordinateDataSize = 2; //Size of texture coordinate data in elements public static int mTextureDataHandle; //Handle to texturedata; private final FloatBuffer mTextureBuffer; //Store model data in float buffer. private final FloatBuffer mVertexBuffer; private final FloatBuffer mColorBuffer; private final FloatBuffer mNormalBuffer; private final ByteBuffer mIndexBuffer; private final int mProgram; private final int mPositionHandle; private final int mColorHandle; private final int mMVPMatrixHandle; private final int mNormalHandle; public static int mLightPosHandle; public final int mMVMatrixHandle; public static int loadTexture(final Context context, final int resourceId) { //Get the texture from the Android resource directory final int[] textureHandle = new int[1]; InputStream is = context.getResources().openRawResource(+ R.drawable.teneighty); Bitmap bitmap = null; try { //BitmapFactory is an Android graphics utility for images bitmap = BitmapFactory.decodeStream(is); } finally { //Always clear and close try { is.close(); is = null; } catch (IOException e) { } } //Generate one texture pointer... GLES20.glGenTextures(1, textureHandle, 0); //and bind it to our array. GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); //Create Nearest Filtered Texture. GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); //Accounting for different texture parameters. GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap. GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); //Clean up bitmap.recycle(); if (textureHandle[0] == 0) { throw new RuntimeException("Error loading texture"); } return textureHandle[0]; } public TexturedLightCube() { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(VERTICES.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); mVertexBuffer = byteBuffer.asFloatBuffer(); mVertexBuffer.put(VERTICES); mVertexBuffer.position(0); byteBuffer = ByteBuffer.allocateDirect(COLORS.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); mColorBuffer = byteBuffer.asFloatBuffer(); mColorBuffer.put(COLORS); mColorBuffer.position(0); byteBuffer = ByteBuffer.allocateDirect(NORMALS.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); mNormalBuffer = byteBuffer.asFloatBuffer(); mNormalBuffer.put(NORMALS); mNormalBuffer.position(0); byteBuffer = ByteBuffer.allocateDirect(TEXTURECOORDS.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); mTextureBuffer = byteBuffer.asFloatBuffer(); mTextureBuffer.put(TEXTURECOORDS); mTextureBuffer.position(0); mIndexBuffer = ByteBuffer.allocateDirect(INDICES.length); mIndexBuffer.put(INDICES); mIndexBuffer.position(0); mProgram = GLES20.glCreateProgram(); GLES20.glAttachShader(mProgram, loadShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER_CODE)); GLES20.glAttachShader(mProgram, loadShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER_CODE)); GLES20.glLinkProgram(mProgram); mTextureDataHandle = GLES20.glGetUniformLocation(mProgram, "u_Texture"); mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram, "a_TexCoordinate"); mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram, "u_Texture"); mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); mMVMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVMatrix"); mLightPosHandle = GLES20.glGetUniformLocation(mProgram, "u_LightPos"); mNormalHandle = GLES20.glGetAttribLocation(mProgram, "a_Normal"); mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); mColorHandle = GLES20.glGetAttribLocation(mProgram, "a_Color"); } /** * Encapsulates the OpenGL ES instructions for drawing this shape. * * @param mvpMatrix The Model View Project matrix in which to draw this shape */ public void draw(float[] mvpMatrix) { // Add program to OpenGL environment. GLES20.glUseProgram(mProgram); //set active texture unit to texture unit 0. GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); // Prepare the cube coordinate data. GLES20.glEnableVertexAttribArray(mPositionHandle); GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, VERTEX_STRIDE, mVertexBuffer); // Prepare the cube color data. GLES20.glEnableVertexAttribArray(mColorHandle); GLES20.glVertexAttribPointer(mColorHandle, 4, GLES20.GL_FLOAT, false, COLOR_STRIDE, mColorBuffer); //Will have the same size as Vertex as we are implementing per vertex lighting GLES20.glEnableVertexAttribArray(mNormalHandle); GLES20.glVertexAttribPointer(mNormalHandle, 3, GLES20.GL_FLOAT, false, VERTEX_STRIDE, mNormalBuffer); // Prepare the cube texture data. GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); //Pass texture coordinate information. GLES20.glVertexAttribPointer(mTextureCoordinateHandle,4, GLES20.GL_FLOAT, false, mTextureCoordinateDataSize, mTextureBuffer); // Apply the projection and view transformation. GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); GLES20.glUniform3f(LightCube.mLightPosHandle, MyGLRenderer.mLightPosInEyeSpace[0], MyGLRenderer.mLightPosInEyeSpace[1], MyGLRenderer.mLightPosInEyeSpace[2]); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glUniform1i(mTextureUniformHandle, 0); // Draw the cube. GLES20.glDrawElements(GLES20.GL_TRIANGLES, INDICES.length, GLES20.GL_UNSIGNED_BYTE, mIndexBuffer); //-removed indices- // Disable vertex arrays. GLES20.glDisableVertexAttribArray(mPositionHandle); GLES20.glDisableVertexAttribArray(mTextureCoordinateHandle); GLES20.glDisableVertexAttribArray(mColorHandle); GLES20.glDisableVertexAttribArray(mNormalHandle); } /** Loads the provided shader in the program. */ private static int loadShader(int type, String shaderCode){ int shader = GLES20.glCreateShader(type); GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; } } 数据转换为dict,然后像字典一样访问它。 我相信它应该像

{{1}}

答案 1 :(得分:1)

你搞砸了你的网址。我不确定HTTP/1.1后缀是什么,但id绝对不属于此。此外,卷曲括号中的所有参数都会显示出来。

import requests
r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0')
response_json = r.json()
print response_json

此代码段打印:

{u'status': u'OPEN', u'contract_name': u'Paris', u'name': u'31705 - CHAMPEAUX (BAGNOLET)', u'bonus': True, u'bike_stands': 50, u'number': 31705, u'last_update': 1474660046000, u'available_bike_stands': 49, u'banking': True, u'available_bikes': 1, u'address': u'RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET', u'position': {u'lat': 48.8645278209514, u'lng': 2.416170724425901}}

总而言之,response_json现在是标准的Python dict,可以使用标准的dict协议从中获取数据。

print response_json['status']  # prints OPEN

答案 2 :(得分:0)

请求有一个内置的JSON解码器,所以不需要使用json库:

import requests

response = requests.get(url)
data = response.json()

根据您问题中的详细信息,&#34;数据&#34; 可能是包含纬度的dicts列表。所以提取第一个可能是:

latitude = data[0]['latitude']

但是您可能希望首先以交互方式使用响应来确保。