2011-10-20 5 views
2

json 데이터를 가져 오는 데 문제가 있습니다. 나는 2 가지 예를 창조했다. 하나는 작동하지만 다른 하나는 작동하지 않습니다. 그리고 내가 필요한게 뭔지 알아? 예, 작동하지 않는 것. 여기에 코드가 있습니다.자바 스크립트 JSON 문제

json 데이터를 출력하는 웹 서비스가 있지만 어떤 이유로 괄호 []를 문자열에 추가하고 작은 따옴표 ''가 누락되었습니다. doens't 작동하지 않는 코드를 보면, 나는 괄호를 수동으로 제거하고 작은 따옴표를 추가하는 것을 볼 수 있습니다. div에 문자열을 쓰면 유효한 Json 데이터입니다. 해당 문자열을 가져 와서 새 변수를 수동으로 선언하면 jQuery.parseJSON이 올바르게 작동합니다. 그러나 새로 생성 된 객체를 구문 분석하면 작동하지 않습니다. 아무도 아이디어가 없나요?

작품 파인

$.ajax({ 
    type: "POST", 
    async: false, 
    contentType: "application/json; charset=utf-8", 
    url: "StudiesWebService.asmx/EventList", 
    data: "{}", 
    dataType: "json", 
    success: function(msg) { 
     var obj = jQuery.parseJSON('{ "id": 1, "title": "Jack STuff", "start": "\/Date(1318939200000)\/", "end": "\/Date(1318950000000)\/", "allDay": false }, { "id": 2, "title": "asdfasdfasdf", "start": "\/Date(1319025600000)\/", "end": "\/Date(1319025600000)\/", "allDay": false}'); 
     var events2 = []; 
     events2.push({ 
      title: obj.title, 
      allDay: obj.allDay, 
      start: 'Tue, 18 Oct 2011 10:00:00 EST', 
      end: 'Tue, 18 Oct 2011 11:00:00 EST' 
     }); 

     callback(events2); 

    }, 
    error: function(e) { $(".external-events").html("An Error Occured" + e); } 
}); 

은 작동하지 않습니다

$.ajax({ 
    type: "POST", 
    async: false, 
    contentType: "application/json; charset=utf-8", 
    url: "StudiesWebService.asmx/EventList", 
    data: "{}", 
    dataType: "json", 
    success: function(msg) { 
     var myObj = new String(msg.d); 

     myObj = myObj.replace("[", ""); 
     myObj = myObj.replace("]", ""); 
     myObj = "'" + myObj + "'"; 

     //at this point myObj output to this: 
     //'{"id":1,"title":"Mike STuff","start":"\/Date(1318939200000)\/","end":"\/Date(1318950000000)\/","allDay":false},{"id":2,"title":"asdfasdfasdf","start":"\/Date(1319025600000)\/","end":"\/Date(1319025600000)\/","allDay":false}' 

     var obj1 = jQuery.parseJSON(myObj); 
     alert(obj1.id); //alert doesn't come up 

     var events = []; 

     events.push({ 
      title: obj1.title, 
      allDay: obj1.allDay, 
      start: 'Tue, 18 Oct 2011 10:00:00 EST', 
      end: 'Tue, 18 Oct 2011 11:00:00 EST' 
     }); 

     callback(events); 
    }, 
    error: function(e) { $(".external-events").html("An Error Occured" + e); } 
}); 
+6

+1 제이슨 : – yoda

+0

모두에게 감사드립니다. 당신은이 오류를 수정했을뿐만 아니라 내가 가지고있는 몇 가지 다른 것들을 고쳤다. 방금 자바 스크립트와 jquery로 작업하기 시작했고 힘든 시간을 보내고 있습니다. vb.net 환경에서오고 C# 및 jquery를 배우는 것이 나의 배후에 있습니다. – MikeB55

+0

나쁜 json을 뱉어내는 webservice를 제어합니까? 그럴 경우 여기에서 보상하려고 노력하지 말고 왜 해결하지 않겠습니까? –

답변

1

그것을 잘해야합니다. 위의 예에서는 ''이 문자열을 묶습니다. 실제로 문자열 자체가 아니므로 myObj에 추가 할 필요가 없습니다.

또한 실제로 2 요소 배열 ([{obj1},{obj2}])을 반환하기 때문에 json은 그 주위에 []을 가지고 있기 때문에 반복해야합니다 그 배열, 또는 첫 번째 요소 (obj[0])

+0

그는 일련의 대상들을 받고 있기 때문에 [그리고]를 제거하고 있다는 것도 사실이다. – Matt

+0

그랬습니다. 도와 주셔서 감사합니다. 내가 제거해야했던 코드와 교체 코드 둘 다. – MikeB55

+0

@Matt yeah, 그냥 주목했다. 고정 된 –

1

을 하나의 문자열로 돌려 것이 전체 개체 주위에 작은 따옴표를 추가 ... 그래서 당신은 아마 그렇게하려고하지는 마라.

괄호가 제거 할 위치가 확실하지 않지만 그 안에있는 객체가 배열로 취급되기 때문에 대괄호를 제거하지 않으려 고합니다.

1

문제는이

myObj = "'" + myObj + "'"; 

JSON 따옴표로 묶어야 안 다음이다.

[ ] 문자도 제거해야 배열로 만들 수 있습니다. 그러나 원시 배열이 유효한 JSON이 아니기 때문에 모든 것을 처리하지 않고 분할하고 평가하는 것이 좋습니다. 이 라인

myObj = "'" + myObj + "'"; 

을 제거하면

+0

그는'['과']를 제거하고 있습니다. 왜냐하면 그는 객체 배열을 받기 때문입니다. – Matt

+0

쉼표를 놓아서 배열로 만들었으므로 올바른 것이지만 올바른 JSON이 아닙니다. 나는 편집 할 것이다 – Ktash

+0

'{{/ * object * /}, {/ * object * /} '를'{/ * object * /}, {/ * object * /}'로 바꾼다. – Matt

1
  1. 왜 당신이 []을 제거를 꺼내? 유효한 JSON 인 무언가를 무언가로 바꾸는 것.

    당신이 얻고있는 응답은 ({}로 표시) 오브젝트합니다 ([]로 표시) 배열입니다.

    dataType: "json"을 설정했기 때문에 jQuery.parseJSON을 호출하면 빠져 나갈 수 있지만, jQuery는이를 분석하므로 data은 내가 지정한 객체의 배열이어야합니다.

  2. 문자열 주변에 '을 추가하면 안됩니다.

  3. data: "{}"은 의미가 없습니다. key = value 쌍의 문자열 (쿼리 문자열과 같은 foo=1&bar=2) 또는 jQuery가 jQuery 문자열로 변환하는 객체 ({foo:1, bar:2})가 필요합니다. 귀하의 경우에는 data 속성을 완전히 생략 할 수 있습니다.
+0

배열이 반환되고 있음을 알기위한 upvote –

+0

json의 유효성을 검사하려했기 때문에 []를 제거하고 있었고 유효하지 않은 것으로 계속 올라갔습니다. 저는 모든 것을 검증 한 괄호를 제거했습니다. – MikeB55

0

을 검사하여 json을 구문 분석하기 전에 json의 형식이 올바른지 확인하십시오. "작동하지 않는"버전의 주석에있는 문자열의 형식이 올바르지 않습니다. "[...]"로 묶어야합니다.