2017-10-26 12 views
2

나는 ColdFusion에서 10 만 ColdFusion에서 9 잘 작동 코드의 버전이 오류 받고 있어요 :ColdFusion 9 JSON 구문 분석 오류가 발생 했습니까?

 <cffunction name="getBuildings" access="remote" output="true" returnformat="JSON"> 
       <cfset fnResults = structNew()> 

       <cfquery name="getBldg" datasource="myData"> 
        SELECT 
         LTRIM(RTRIM(number)) AS bldgNum, 
         LTRIM(RTRIM(name)) AS bldgName 
        FROM Bldg WITH (NOLOCK) 
        ORDER BY name 
       </cfquery> 

       <cfset fnResults.recordcount = getBldg.recordcount> 

       <cfif getBldg.recordcount EQ 0> 
        <cfset fnResults.message = "No Buildings found."> 
       <cfelse> 
        <cfloop query="getBldg"> 
         <cfset fnRecBldg[currentRow] = StructNew()> 
         <cfset fnRecBldg[currentRow].bldgName = URLEncodedFormat(getBldg.name)> 
         <cfset fnRecBldg[currentRow].bldgNumber = getBldg.number> 
        </cfloop> 
        <cfset fnResults.data = fnRecBldg> 
       </cfif> 

       <cfset fnResults.status = "200"> 
      <cfreturn fnResults> 
    </cffunction> 

: 여기

SyntaxError: JSON.parse: expected ',' or '}' after property value in object at line 1 column 13714 of the JSON data 

내 데이터를 JSON으로 변환됩니다 내 cffunction의입니다 여기 내 JQUERY입니다 :

:

여기
function getBldg(){ 
    var dist = $('.chBldg'); 

     $.ajax({ 
      type: 'POST', 
      url: 'Application.cfc?method=getBuildings', 
      data: {}, 
      dataType: 'json' 
     }).done(function(obj){ 
      var numRecs = obj.RECORDCOUNT; 

      if(obj.STATUS == 200){ 
       if(numRecs == 0){ 
        dist.find("option:gt(0)").remove(); 
       }else{ 
        dist.find("option:gt(0)").remove(); 

        for(var i=0; i < numRecs; i++){ 
         var jsRec = obj.DATA[i]; 
         dist.append($("<option />").val(jsRec.BLDGNUMBER).text(decodeURIComponent(jsRec.BLDGNAME) +' ('+ jsRec.BLDGNUMBER +')')); 
        } 
       } 
      }else{ 
      } 
     }).fail(function(jqXHR, textStatus, errorThrown){ 
      alert(errorThrown); 
     }); 
    } 
} 

는 rerurned 데이터의 작은 예입니다

{"RECORDCOUNT":4,"STATUS":200,"DATA":[ 
    {"BLDGNAME":"Fall%2DCasey","BLDGNUMBER":"0012"}, 
    {"BLDGNAME":"Autmun","BLDGNUMBER":"0022"}, 
    {"BLDGNAME":"Cedar","BLDGNUMBER":0201}, 
    {"BLDGNAME":"Great%20Lake","BLDGNUMBER":1215}]} 

이 오류는 ColdFusion 버전 9/10 및 내 JSON 데이터 구성 방법과 관련되어 있어야합니다. 나는 아직도 그 버그를 발견하지 못했다. 누구든지 내 코드 ID가 깨지는 곳을 알고 있으면 알려주세요.

+0

데이터의 더 작은 샘플을 처리 한 다음 오류가 트리거 된 것을 발견 할 때까지 계속 추가합니다. 그러나 내가 추측해야만한다면, 그것은 탈출하지 못한 인물 일 것이라고 확신합니다. 마지막으로, 적어도 2016 년에 CF 2016을 개발 상자에로드하고 코드를 실행합니다. –

+0

오류에서 언급 한 문자 위치 13714 주변의 데이터를보십시오. 아마 당신에게 단서를 줄 것입니다. –

+0

@ Miguel-F 위치 13714에서 문자를 찾았습니다. 여기 값 : BLDGNUMBER : 0000 왜 오류가 발생하는지 잘 모르겠습니다. –

답변

2

코드에 아무런 문제가 없다고 생각합니다. ColdFusion에서 serializeJSON을 많이 잘못 생각합니다.

CF9가 모든 숫자 형 값을 문자열로 처리하도록 강요하는 한 가지 트릭/해킹은 클라이언트 측을 사용하기 전에 숫자가 아닌 텍스트를 값에 추가하고 제거하는 것입니다. 나는 과거에 ASCII 컨트롤 문자 2 "텍스트 시작"을 사용했습니다. 나는 사용자가 의도적으로 사용하지 않을 것이라고 확신하기 때문에 다른 텍스트 위에 제어 문자를 사용하는 것을 좋아합니다.

제어 문자를 건물 번호에 추가하려면 getBldg.number 앞에 chr(2) &을 추가하십시오. 클라이언트 측에서는 jQuery가 dataFilter 속성을 사용하여 JSON 문자열에서 제어 문자를 제거하도록 지시 할 수 있습니다.

$.ajax({ 
    type: 'POST', 
    url: 'Application.cfc?method=getBuildings', 
    data: {}, 
    dataType: 'json', 
    dataFilter: function(data, type){ 
     //Remove all start of text characters 
     return data.replace(/\u0002/g,""); 
    } 
})