在Jade中解析JSON

时间:2016-05-03 12:24:26

标签: javascript json node.js express pug

我有很多对象,我通过express传递给Jade模板。它看起来像这样:

[{ big object }, { big object }, { big object }, ...]

我通过字符串化将其传递给Jade模板:

res.render('search-results', {
  data: JSON.stringify(body)
});

在我的Jade模板中,我试图解析JSON并迭代其中的每个对象,如下所示:

each d, i in JSON.parse(data)
  // Do stuff

但是,当我打印d时,[object Obj]被记录为JSON.parse(d),因此我无法访问对象。当我尝试d时,它也会失败,因为package rishabh.agarwal.holmes.video1; import android.content.Context; import android.hardware.Camera; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; import android.widget.Toast; import java.io.IOException; public class AndroidVideoCapture extends AppCompatActivity{ private Camera myCamera; private MyCameraSurfaceView myCameraSurfaceView; private MediaRecorder mediaRecorder; Button myButton; SurfaceHolder surfaceHolder; boolean recording; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); recording = false; setContentView(R.layout.main); //Get Camera for preview myCamera = getCameraInstance(); if(myCamera == null){ Toast.makeText(AndroidVideoCapture.this, "Fail to get Camera", Toast.LENGTH_LONG).show(); } myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera); FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview); myCameraPreview.addView(myCameraSurfaceView); myButton = (Button)findViewById(R.id.mybutton); myButton.setOnClickListener(myButtonOnClickListener); } Button.OnClickListener myButtonOnClickListener = new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(recording){ // stop recording and release camera mediaRecorder.stop(); // stop the recording releaseMediaRecorder(); // release the MediaRecorder object recording=false; Log.e("aaa","step1"); myButton.setText("START"); //Exit after saved // finish(); }else{ //Release Camera before MediaRecorder start releaseCamera(); if(!prepareMediaRecorder()){ Toast.makeText(AndroidVideoCapture.this, "Fail in prepareMediaRecorder()!\n - Ended -", Toast.LENGTH_LONG).show(); finish(); } mediaRecorder.start(); recording = true; myButton.setText("STOP"); } }}; private Camera getCameraInstance(){ // TODO Auto-generated method stub Camera c = null; try { c = Camera.open(); c.setDisplayOrientation(90);// attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable } private boolean prepareMediaRecorder(){ myCamera = getCameraInstance(); mediaRecorder = new MediaRecorder(); myCamera.unlock(); mediaRecorder.setCamera(myCamera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mediaRecorder.setOutputFile("/sdcard/myvideo.mp4"); mediaRecorder.setMaxDuration(3600000); // Set max duration 60 sec. mediaRecorder.setMaxFileSize(500000000); // Set max file size 5M mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface()); mediaRecorder.setOrientationHint(90); try { mediaRecorder.prepare(); } catch (IllegalStateException e) { releaseMediaRecorder(); return false; } catch (IOException e) { releaseMediaRecorder(); return false; } return true; } @Override protected void onPause() { super.onPause(); releaseMediaRecorder(); // if you are using MediaRecorder, release it first releaseCamera(); // release the camera immediately on pause event } private void releaseMediaRecorder(){ if (mediaRecorder != null) { mediaRecorder.reset(); // clear recorder configuration mediaRecorder.release(); // release the recorder object mediaRecorder = null; myCamera.lock(); // lock camera for later use } } private void releaseCamera(){ if (myCamera != null){ myCamera.release(); // release the camera for other applications myCamera = null; } } public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ private SurfaceHolder mHolder; private Camera mCamera; public MyCameraSurfaceView(Context context, Camera camera) { super(context); mCamera = camera; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int weight, int height) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null){ // preview surface does not exist return; } // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview } // make any resize, rotate or reformatting changes here // start preview with new settings try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e){ } } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub // The Surface has been created, now tell the camera where to draw the preview. try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 字面上是字符串" [object Obj]"。我已经尝试过将一些不同的方式传递给模板,并且不断缩短。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

通过执行以下操作修复:

在后端Express端构造对象数组时,我将数组中的每个对象都字符串化。然后,我将字符串化的JSON对象数组传递给Jade模板,从而能够解析和使用数据。

答案 1 :(得分:0)

尝试each d, i in JSON.parse(data[0])

由于你发送了一个对象数组,你需要更深层次地来到对象。