2010-07-29 1 views
0

Это я снова (previous question) У меня все еще возникают проблемы с возвратом json и xml из вызова ajax.Ajax-запрос к моим веб-сервисам возвращает xml в моем json - Part 2

Я написал веб-сервис в MonoDevelop версии 2.2, чтобы вернуть мой json.

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string getLocationJ(){} 

Который возвращается: -

JavaScriptSerializer js = new JavaScriptSerializer(); 
string json = js.Serialize(bigPM); 
return json; 

Если я проверить мой WebService я получаю: -

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">[{"placeName":"XXXX","address":"Some Address","lat":12121,"lng":12121}]</string> 

Какой именно то, что я втягивая когда я делаю свои АЯКС звонки. Мой json все еще завернут в XML и поэтому не может быть прочитан.

Это мой Аякса вызов: -

$.ajax({ 
    type: "GET", 
    url: theURL, 
    async: true, 
    data: {minLong:minLon, maxLong:maxLon, minLat:minLat, maxLat:maxLat}, 
    cache: false, 
    dataType: "jsonp", 
    contentType: "application/xml; charset=utf-8", 
    success: function (data) { 
    alert('in here'); 



    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
       alert(xhr.status); 
       alert(thrownError); 
       alert(xhr.statusText); 
      } 
    }); 

Если я просто JSon я получаю 500 Внутренняя ошибка сервера, если я делаю POST я получаю 403 запрещенную ошибку.

Этим утром я попытался сделать: -

$.getJSON(theURL, {minLong:minLon, maxLong:maxLon, minLat:minLat, maxLat:maxLat}, function(data) { 
); 
}); 

только я получаю те же самые проблемы.

Если бы я мог просто удалить xml из моего json, тогда я мог бы двигаться вперед, но прямо сейчас я мертв в воде, и я думаю, что я тону в ajax!

Пожалуйста, помогите Шерил

+1

Это не является проблемой Javascript. Ваш сервер - это то, что помещает обертку XML вокруг строки, так что это какая-то проблема с конфигурацией. – Pointy

+0

Что я нахожу интересным является то, что я был в этом примере http://williamsportwebdeveloper.com/cgi/wp/?p=494 И если вы проверяете его WebServices они оба возвращают JSON, обернутый в XML. Но он также делает «POST» в своих вызовах ajax. Возможно, я тоже буду делать POST.Но с POST я получаю 403 запрещенных. Считаете ли вы, что это связано с тем, что я называю HTTPS? Как я могу обойти ошибку 403? Есть идеи? – Cheryl

ответ

0

изменение

contentType: "application/xml; charset=utf-8", 

в

contentType: "application/json; charset=utf-8", 

Полный пример:

/* in this case I am using */ 
     <script src="Js/json2.js" type="text/javascript"></script> 

    // available at: http://www.json.org/js.html 

function jsonObject() 
{ 
}; 
var phoneListObject = new jsonObject(); 

function SaveJsonObject() 
{ 
    phoneListObject.Control = new jsonObject(); 
    phoneListObject.Control.CustomerId = $("#CustomerId").val(); 
    phoneListObject.Control.CustomerName = $("#CustomerName").val(); 
    phoneListObject.ListBody.PhonesBlock = new jsonObject(); 
    phoneListObject.ListBody.PhonesBlock.Phone = new Array(); 
    $('#PhonesBlock .Phone').each(function(myindex) 
    { 
     phoneListObject.ListBody.PhonesBlock.Phone[myindex].PhoneNumber = $(".PhoneNumber input", this).val(); 
     phoneListObject.ListBody.PhonesBlock.Phone[myindex].PhoneName = $(".PhoneName input", this).val(); 
    }); 
}; 

$(function() 
{ 
    function SaveCurrentList() 
    { 
     SaveJsonObject(); 
     var currentSet = phoneListObject; 
     var formData = { FormData: currentSet }; 
     phoneListJSON = JSON.stringify(formData); 
     var FormData = "{ FormData:" + JSON.stringify(phoneListJSON) + "}"; 
     SavePhoneListData(FormData); 
    }; 
    function SavePhoneListData(phonesData) 
    { 
     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: phonesData, 
      dataFilter: function(data) 
      { 
       var msg; 
       if ((typeof (JSON) !== 'undefined') && 
     (typeof (JSON.parse) === 'function')) 
        msg = JSON.parse(data); 
       else 
        msg = eval('(' + data + ')'); 
       if (msg.hasOwnProperty('d')) 
        return msg.d; 
       else 
        return msg; 
      }, 
      url: "../../WebServices/ManagePhones.asmx/SaveJson", 
      success: function(msg) 
      { 
       SaveSuccess(msg);/* the JSON is in the msg, create this function to do what you want with it. */ 
      }, 
      complete: function(xhr, textresponse) 
      { 
       var err = eval("(" + xhr.responseText + ")"); 
      }, 
      error: function(msg) 
      { 
      }, 
      failure: function(msg) 
      { 
      } 
     }); 
    }; 
    $('#btnSave').click(function() 
    { 
     SaveCurrentList(); 
    }); 
}); 

/* json data snip */ 
{"FormData":{"Control":{"CustomerId":"12345y6","CustomerName":"Joe Customer"},"PhonesBlock":{"Phone":[{"PhoneNumber":"234-233-2322","PhoneName":"son harry"},{"PhoneNumber":"234-233-2323","PhoneName":"son frank"},{"PhoneNumber":"234-233-2320","PhoneName":"momk"}]}}} 

/*XML of the form data:*/ 
<FormData> 
    <Control> 
     <CustomerId>12345y6</CustomerId> 
     <CustomerName>Joe Customer</CustomerName> 
    </Control> 
    <PhonesBlock> 
     <Phone> 
      <PhoneNumber>234-233-2322</PhoneNumber> 
      <PhoneName>son harry</PhoneName> 
     </Phone> 
     <Phone> 
      <PhoneNumber>234-233-2323</PhoneNumber> 
      <PhoneName>son frank</PhoneName> 
     </Phone> 
     <Phone> 
      <PhoneNumber>234-233-2321</PhoneNumber> 
      <PhoneName>momk</PhoneName> 
     </Phone> 
    </PhonesBlock> 
</FormData> 

/* form layout snip */ 

<div class="control"> 
    <div class="customer"> 
     <input typeof="text" id="CutomerId" /> 
     <input typeof="text" id="CutomerName" /> 
    </div> 
    <div class="phoneslist" id="PhonesBlock"> 
     <div class="Phone"> 
      <input typeof="text" class="PhoneNumber" /> 
      <input typeof="text" class="PhoneName" /> 
     </div> 
     <div class="Phone"> 
      <input typeof="text" class="PhoneNumber" /> 
      <input typeof="text" class="PhoneName" /> 
     </div> 
     <div class="Phone"> 
      <input typeof="text" class="PhoneNumber" /> 
      <input typeof="text" class="PhoneName" /> 
     </div> 
    </div> 
</div> 
<input id="buttonSave" class="myButton" type="button" value="Save" /> 

подпись метода веб-службы:

[WebMethod(EnableSession = true)] 
    public string SaveJson(string FormData) 
    { 
    } 
+0

ooops too bad Я оставил это по ошибке - я сделал это, и это не имеет значения. У меня все еще есть json, завернутый в xml. – Cheryl

+0

Вы можете попробовать использовать класс сериализатора: http://james.newtonking.com/pages/json-net.aspx –

+0

ли я делаю json или xml. Я продолжаю получать этот ответ в firebug: - missing; перед оператором [{... nue "," lat ": -79.45," lng ": 43.6801}, {" pla – Cheryl

0

Быстрое и грязное исправление заключается в извлечении json из xml в функцию успеха.

$.ajax({ 
    type: "GET", 
    url: theURL, 
    async: true, 
    data: {minLong:minLon, maxLong:maxLon, minLat:minLat, maxLat:maxLat}, 
    cache: false, 
    dataType: "jsonp", 
    contentType: "application/xml; charset=utf-8", 
    success: function (data) { 

data = extractJsonFromXml(data); 
    //you have to write extractJsonFromXml function in js, you could use substring, or a regex replace. 

} 
0

Убедитесь, что ваш класс обслуживания имеет атрибут [ScriptService]. Этот атрибут не добавляется по умолчанию.

0

Вместо того, чтобы возвращать строку в вашем WebMethod, возвратите недействительным и применение:

JavaScriptSerializer js = new JavaScriptSerializer(); 
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT)); 
+0

Пожалуйста, не копируйте и вставьте свои ответы на несколько вопросов. Если вопросы разные, пожалуйста, сделайте свои ответы уникальными для заданного вопроса. Если вопросы одинаковы, они должны быть помечены или закрыты (что у вас пока нет репутации). –