실례를 통해 json과 jsonp의 원리와 사용 방법을 분석하다

8360 단어 jsonjsonp
1.json과 jsonp의 도입
aax에서 JSON은 데이터 교환 문제를 해결하는 데 사용되고, JSONP는 전역을 실현합니다.
비고: 크로스 도메인도 서버 에이전트를 통해 해결할 수 있습니다.
이해: JSON은 데이터 교환 형식이고 JSONP는 개발자의 총명한 재능에 의존하여 만들어진 비공식적인 크로스 데이터 상호작용 프로토콜이다.
2.JSON: 텍스트 기반의 데이터 교환 방식이나 데이터 설명 형식이라고 하는데 이 형식을 선택해야 할지 여부는 우선 그 장점에 주목해야 한다.
JSON의 장점:
  • 1) 순수한 텍스트를 바탕으로 크로스플랫폼 전달이 매우 간단하다
  • 2) Javascript 원본 지원, 백그라운드 언어 거의 모든 지원
  • 3) 경량급 데이터 형식은 문자 수량이 극히 적고 인터넷 전달에 특히 적합하다
  • 4) 가독성이 강하여 XML보다 일목요연하지는 않지만 합리적인 순서대로 축소된 후에 식별하기 쉽다
  • 5) 작성하고 해석하기 쉬우므로 당연히 전제는 데이터 구조를 알아야 한다는 것이다
  • JSON 형식 또는 규칙:
    JSON은 매우 간단한 방식으로 데이터 구조를 묘사할 수 있고 XML이 할 수 있는 것은 모두 할 수 있기 때문에 크로스플랫폼 방면에서 양자를 가리지 않는다.
  • 1) JSON은 두 가지 데이터 형식 설명자만 있습니다. 대괄호 {}와 대괄호 [], 나머지 영문 사칭: 맵 문자, 영문 쉼표, 구분 문자, 영문 큰따옴표 ""은 정의 문자입니다
  • 2) 대괄호 {}는'서로 다른 유형의 무질서한 키 값 집합'(각 키 값 쌍은 OOP의 속성 설명으로 이해할 수 있음)을 설명하고, 대괄호 []는'같은 유형의 질서정연한 데이터 집합'(OOP에 대응할 수 있는 그룹)을 설명하는 데 사용된다
  • 3) 상기 두 집합 중 여러 개의 자항이 있으면 영문 쉼표를 통해 구분한다..
  • 4) 키 값은 영문 사칭: 구분을 하고 키 이름에 모두 영문 큰따옴표 ""을 붙여서 서로 다른 언어의 해석을 편리하게 하는 것을 권장합니다
  • 5) JSON 내부에서 자주 사용하는 데이터 유형은 문자열, 숫자, 부울, 날짜,null 등 몇 가지가 아니다. 문자열은 반드시 쌍인용부호로 시작해야 하고 나머지는 사용하지 않는다. 날짜 유형은 비교적 특수하다. 여기서 설명하지 않겠다
  • 다만 클라이언트가 날짜 정렬 기능에 대한 수요가 없다면 날짜 시간을 문자열로 직접 전달하면 많은 번거로움을 줄일 수 있다고 건의합니다.
    
     1:{}  “ ”
        var person = {
          "Name": "Bob",
          "Age": 32,
          "Company": "IBM",
          "Engineer": true
        }
       2:[]  “ ”
        var members = [
          {
            "Name": "Bob",
            "Age": 32,
            "Company": "IBM",
            "Engineer": true
          },
          {
            "Name": "John",
            "Age": 20,
            "Company": "Oracle",
            "Engineer": false
          },
          {
            "Name": "Henry",
            "Age": 45,
            "Company": "Microsoft",
            "Engineer": false
          }
        ]
        // John 
        var johnsCompany = members[1].Company;
      
       3:{} [] 
        var conference = {
          "Conference": "Future Marketing",
          "Date": "2012-6-1",
          "Address": "Beijing",
          "Members":
          [
            {
              "Name": "Bob",
              "Age": 32,
              "Company": "IBM",
              "Engineer": true
            },
            {
              "Name": "John",
              "Age": 20,
              "Company": "Oracle",
              "Engineer": false
            },
            {
              "Name": "Henry",
              "Age": 45,
              "Company": "Microsoft",
              "Engineer": false
            }
          ]
        }
      
        //  Henry 
        var henryIsAnEngineer = conference.Members[2].Engineer;
    3. JSONP란 무엇인가
    JSONP(JSON with Padding)는 자료 형식인 JSON의'사용 모드'로 웹 페이지를 다른 네트워크에서 자료를 요구할 수 있다.동원 정책 때문에 일반적으로 서버 1에 있습니다.example.com의 웹 페이지는 서버가 아닌 페이지와 연결할 수 없습니다.example.com의 서버는 소통하지만 HTML의 요소는 예외입니다. 요소의 이 개방 전략을 이용하여 웹 페이지는 다른 출처에서 동태적으로 발생한 JSON 자료를 얻을 수 있는데 이런 사용 모델은 이른바 JSONP이다.JSONP로 잡은 자료는 JSON이 아니라 임의의 JavaScript입니다. JSON 해상도가 아닌 JavaScript 직역기로 실행합니다.
    3.1 JSOPN 크로스 필드의 원리: script 라벨의 src 속성, 크로스 필드 지원;그것의 기본 사상은 웹 페이지가 요소를 추가하여 서버에 JSON 데이터를 요청하는 것이 동원 정책의 제한을 받지 않는다는 것이다.서버가 요청을 받은 후 데이터를 지정한 이름의 리셋 함수에 넣고 전송합니다.
    3.2 JSOP는 두 부분을 포함한다. 리셋 함수와 데이터. 리셋 함수는 응답이 왔을 때 호출해야 하는 함수로 일반적으로 검색 문자열을 통해 추가한다.데이터는 리셋 함수에 전송된 JSON 데이터입니다. 정확히 말하면 JSON 대상입니다. 직접 접근할 수 있습니다.
    3.3 JSONP의 단점:
    1) GET만 가능하고 POST는 없습니다.
    2) 다른 도메인에서 로드된 코드가 안전하지 않을 수 있습니다.JSONP 요청이 실패했는지 확인하기 어렵습니다(XHR에 error 이벤트가 있음). 일반적인 방법은 타이머를 사용하여 응답의 허용 시간을 지정하고 시간을 초과하면 응답에 실패했다고 생각하는 것입니다.
    클라이언트가 데이터를 사용하는 것을 편리하게 하기 위해 비공식 전송 프로토콜 jsonp를 점차적으로 형성하는 이 프로토콜의 요점은 사용자가callback 파라미터를 서버에 전달하도록 허용하는 것이다. 그리고 서버가 데이터를 되돌릴 때 이callback 파라미터를 함수 이름으로 감싸서 클라이언트가 임의로 자신의 함수를 사용자 정의하여 자동으로 되돌려 주는 데이터를 처리할 수 있도록 하는 것이다
    표시:
    
    function ajaxFun(){
          var strUrl="http://www.b.com/demo/json.txt";
           $.ajax({
            type:"get",
            url:strUrl,
            dataType: 'jsonp',
            jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
            jsonpCallback: "flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
            success: function(data){
              alert('您查到的信息:票价' + data.price + '元,余-票' + data.tickets + '张。');
            },
            error: function(XMLHttpRequest,textStatus,errorThrown){
              alert("error");
              // 状态码
              console.log(XMLHttpRequest.status);
              // 状态
              console.log(XMLHttpRequest.readyState);
              // 错误信息  
              console.log(textStatus);
             }
          });
        }
    참고:
    그 중에서sucess의 코드 단편도 쓰지 않고 되돌아오는 데이터를 호출할 수 있는 리셋 함수를 따로 만들 수 있습니다.아래와 같이 데이터를 얻을 수 있다.
    var flightHandler = function (data) {
    alert('당신이 찾은 정보: 표값'+data.price +'원, 여표'+data.tickets +'장.');
    };
    주의해야 할 것은, aax 크로스 필드 요청(jsonp)에서 서버가 데이터 형식을 되돌려주는 것은: flightHandler({"price":"120", "tickets":"20"});만약 직접 이러한 json 형식 {"price":"120", "tickets":"20"},parser error의 오류를 보고합니다.이 함수의 마지막 분호 ";"에 주의하십시오.추가해야 합니다. 그렇지 않으면 같은 페이지에 여러 개의 aax 요청이 있고 데이터가 되돌아오지 않을 때 다른 aax 요청을 보낼 때parsererror 오류 메시지가 나타날 수 있습니다.이런 오류는 매우 은밀하여 개발할 때 쉽게 발견하지 못하고 병행 테스트를 할 때 쉽게 드러난다.
    서버 코드 목록:
    
    public String jsonReturn(HttpServletResponse response, String callback, Map<String, Object> jsonMap) {
        if (org.apache.commons.lang.StringUtils.isEmpty(callback)) {
          return appAjaxJson(response, getJson(jsonMap));
        }
        return appAjaxJson(response, callback + "(" + getJson(jsonMap) + ")");
      }
    
      public String appAjaxJson(HttpServletResponse response, String jsonString) {
        return appAjax(response, jsonString, "text/html");
      }
    
      public String appAjax(HttpServletResponse response, String content, String type) {
        try {
          response.setContentType(type + ";charset=UTF-8");
          response.setHeader("Access-Control-Allow-Origin", "*");//表示支持跨域请求
          // 如果IE浏览器则设置头信息如下
          if ("IE".equals(type)) {
            response.addHeader("XDomainRequestAllowed", "1");
          }
          response.setHeader("Pragma", "No-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setDateHeader("Expires", 0);
          response.getWriter().write(content);
          response.getWriter().flush();
        } catch (IOException e) {
          this.logException(e);
        }
        return null;
      }
    4、JSON.stringify()、JSON.parse()、toString()
    4.1 JSON.stringify(): 인삼(JavaScript 값)을 JSON 문자열로 변환합니다.
    
    示列1:
      let arr = [1,2,3];
      JSON.stringify(arr);//"[1,2,3]"
      typeof JSON.stringify(arr);//"string"
    
      示例2:
      //判断数组是否包含某对象
      let data = [
        {name:'echo'},
        {name:'听风是风'},
        {name:'天子笑'},
        ],
        val = {name:'天子笑'};
      JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1;//true
    
      //判断两数组/对象是否相等
      let a = [1,2,3],
        b = [1,2,3];
      JSON.stringify(a) === JSON.stringify(b);//true
    4.2 JSON.parse(): JSON 문자열을 하나의 객체로 변환합니다.
    표시:
    let string = '[1,2,3]';
    console.log(JSON.parse(string))//[1,2,3]
    console.log(typeof JSON.parse(string))//object
    4.3 JSON.stringify () 와 toString () 의 차이점
    let arr = [1,2,3];
    JSON.stringify(arr);//'[1,2,3]'
    arr.toString();//1,2,3
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기