JSON 구문 분석 오류 예기치 않은 입력 끝
나는 다음과 같은 코드를 받았다.
function pushJsonData(productName) {
$.ajax({
url: "/knockout/SaveProduct",
type: "POST",
contentType: "application/json",
dataType: "json",
data: " { \"Name\" : \"AA\" } ",
async: false,
success: function () {
loadJsonData();
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus + " in pushJsonData: " + errorThrown + " " + jqXHR);
}
});
}
데이터 값을 하드 코딩했습니다.데이터가 데이터베이스에 올바르게 푸시됩니다.하지만 오류가 계속 발생합니다.
구문 분석 오류 예기치 않은 입력 끝
제 데이터가 올바른 JSON 구문임을 확신합니다.Network of Chrome inspector에서 확인해보니 saveProduct 요청에서 데이터가 정확하다고 나왔습니다.
{ "Name": "AA" }
이 POST 요청은 응답하지 않았습니다.그래서 해석 오류의 출처를 알 수 없습니다.FireFox 브라우저를 사용해 보았습니다.똑같은 일이 일어났어요.
뭐가 잘못됐는지 누가 좀 말해줄래?
감사해요.
추신. 여기 컨트롤러 코드가 있습니다.
namespace MvcApplJSON.Controllers
{
public class KnockoutController : Controller
{
//
// GET: /Knockout/
public ActionResult Index()
{
return View();
}
[HttpGet]
public JsonResult GetProductList()
{
var model = new List<Product>();
try
{
using (var db = new KOEntities())
{
var product = from p in db.Products orderby p.Name select p;
model = product.ToList();
}
}
catch (Exception ex)
{ throw ex; }
return Json(model, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public void SaveProduct (Product product)
{
using (var db = new KOEntities())
{
db.Products.Add(new Product { Name = product.Name, DateCreated = DateTime.Now });
db.SaveChanges();
}
}
}
}
무엇이 문제인지 확실히 말할 수 없다.나쁜 캐릭터일 수도 있고, 처음과 끝에 남겨진 공간일 수도 있고, 잘 모르겠어요.
어쨌든 JSON을 지금까지와 같이 문자열로 하드 코드화해서는 안 됩니다.대신 JSON 데이터를 서버로 보내는 적절한 방법은 JSON 시리얼라이저를 사용하는 것입니다.
data: JSON.stringify({ name : "AA" }),
이제 서버에서도 다음 입력을 수신할 것으로 예상되는 적절한 뷰 모델이 있는지 확인합니다.
public class UserViewModel
{
public string Name { get; set; }
}
및 대응하는 액션:
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
}
이제 한 가지 더 있습니다. you you 。dataType: 'json'이는 서버가 JSON 결과를 반환할 것으로 예상한다는 것을 의미합니다.JSON을 사용하다컨트롤러 조작에 의해 뷰가 반환되는 경우는, 에러가 발생하고 있는 것을 생각할 수 있습니다.할 때 입니다.jQuery는 다음과 같습니다.
[HttpPost]
public ActionResult SaveProduct(UserViewModel model)
{
...
return Json(new { Foo = "bar" });
}
말하면,엔 '어느 정도', '어느 정도', '어느 정도', '어느 정도', '어느 정도'를 됩니다.dataTypeASP의 AJAX입니다.NET MVC 「 」는, 의 「 」를 에, 「 」가 반환되기 입니다.ActionResult:ViewResult ★★★JsonResult 、 [ ] 、 [ ] 、 [ ] 、 [ ] 、 [ ]가 자동적으로 됩니다.Content-Type이을 해석하고 해석된 합니다.jQuery는 이 헤더를 사용하여 응답을 해석하고 이미 해석된 성공 콜백의 파라미터로 이 헤더를 공급합니다.
여기서 문제가 발생하고 있는 것은, 서버가 유효한 JSON을 반환하지 않은 것 같습니다.일부 ViewResult 또는 PartialViewResult를 반환했거나 컨트롤러 액션에서 파손된 JSON을 수동으로 작성하려고 했습니다(이 작업은 절대 수행하지 말고 JsonResult를 사용해야 합니다).
내가 방금 깨달은 게 하나 더 있어.
async: false,
false(거짓말하지 마세요. 를 Attribute로 false요청을 실행하는 동안 클라이언트브라우저를 정지하고 있습니다.이 경우에는 그냥 일반적인 요청을 하면 됩니다.AJAX 를 사용하는 경우는, 비동기 이벤트나 콜백의 관점에서 생각해 주세요.
를 .http, 「 」를 실시합니다.data이 이벤트는 데이터를 일시적으로 버퍼에 넣을 뿐이므로 완전한 JSON을 사용할 수 없습니다., 「」, 「」data이벤트는 변수에 추가해야 합니다.도움이 될 수 있습니다(http://nodejs.org/api/http.html)).
빈 Json을 반환하지 않음
, 나는 빈칸을 .Json「」의.Net Core Web API프로젝트.
코드를 변경했습니다.
부터
return Ok();
로.
return Ok("Done");
문자열이나 오브젝트를 반환해야 할 것 같습니다.
이게 도움이 됐으면 좋겠다.
이 문제는 이름/값 쌍에 대한 작은 따옴표 때문에 발생했습니다. 데이터: "{'Name':"AA'}"
이름/값 쌍의 큰따옴표로 변경하면 올바르게 작동합니다. 데이터: '{"Name":AA"}' 또는 이와 같은 데이터: "{\"Name\":"AA"
예기치 않은 입력 종료는 파서가 조기에 종료되었음을 의미합니다.를 들어, 「 」, 「 」, 「 」를 상정하고 있는 경우가 ."abcd...wxyz", 「」만 표시됩니다."abcd...wxy
이 오류는 어딘가에 있는 오타일 수도 있고, 인코딩이 어플리케이션의 다른 부분에 섞여 있을 때 발생하는 문제일 수도 있습니다.
를 들어,해 보겠습니다.chrome.runtime.sendNativeMessage:
chrome.runtime.sendNativeMessage('appname', {toJSON:()=>{return msg}}, (data)=>{
console.log(data);
});
콜백을 호출하기 전에 브라우저는 다음 명령을 사용하여 메시지 해석을 시도합니다.JSON.parse그러면 제공된 바이트 길이가 데이터와 일치하지 않으면 "예상하지 않은 입력 끝" 오류가 발생할 수 있습니다.
아마도 유용할 것이다.
메서드 매개 변수 이름은 JSON과 같아야 합니다.
잘 될 거야
C#
public ActionResult GetMTypes(int id)
JS
var params = { id: modelId };
var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
$.ajax({
type: "POST",
url: url,
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(params),
정상적으로 동작하지 않습니다.
C#
public ActionResult GetMTypes(int modelId)
JS
var params = { id: modelId };
var url = '@Url.Action("GetMTypes", "MaintenanceTypes")';
$.ajax({
type: "POST",
url: url,
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(params),
노드 JS에서 이 작업을 수행했더니 이 문제가 해결되었습니다.
var data = JSON.parse(Buffer.concat(arr).toString());
스포일러: 서버 측 문제 가능성
다음은 제가 발견한 내용입니다.내 코드는 서버로부터의 응답을 예상했습니다.서버가 200개의 코드만을 반환했을 때, json 파서가 에러를 예기치 않은 입력의 끝에 던졌을 때, 여기서 충분치 않았습니다.
fetch(url, {
method: 'POST',
body: JSON.stringify(json),
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json()) // here is my code waites the responce from the server
.then((res) => {
toastr.success('Created Type is sent successfully');
})
.catch(err => {
console.log('Type send failed', err);
toastr.warning('Type send failed');
})
\nJSON의은 결결 the the를 사용하는 이었습니다.string.replace('\n','\\n')
이 에러는, 빈 JSON 파일의 판독시에 발생합니다.
노드에서 이 오류를 방지하려면JS 파일 크기를 확인하는 중입니다.
const { size } = fs.statSync(JSON_FILE);
const content = size ? JSON.parse(fs.readFileSync(JSON_FILE)) : DEFAULT_VALUE;
언급URL : https://stackoverflow.com/questions/20827372/json-parsing-error-syntax-error-unexpected-end-of-input
'programing' 카테고리의 다른 글
| 재료 UI 대화상자 머리글 오른쪽 상단 모서리에 닫기 아이콘을 추가하는 방법 (0) | 2023.04.01 |
|---|---|
| JSON의 .d는 무엇을 의미합니까? (0) | 2023.04.01 |
| AngularJS - ng-repeat을 사용하여 무선 입력 세트 생성 (0) | 2023.04.01 |
| 몽구스에서는 날짜별로 어떻게 정렬하나요?(node.disples) (0) | 2023.04.01 |
| 스토어드 프로시저를 호출하기 위한 Spring JDBC 템플릿 (0) | 2023.04.01 |