programing

JSON 구문 분석 오류 예기치 않은 입력 끝

mbctv 2023. 4. 1. 09:51
반응형

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

반응형