값을 구문 분석하는 동안 예기치 않은 문자가 발견되었습니다.


113

현재 몇 가지 문제가 있습니다. Json.NET에서 C #을 사용하고 있습니다. 문제는 내가 항상 얻는 것입니다.

{ "값을 구문 분석하는 동안 예기치 않은 문자가 발견되었습니다. e. 경로 '', 줄 0, 위치 0."}

그래서 Json.NET을 사용하는 방법은 다음과 같습니다. 저장해야 할 클래스가 있습니다. 클래스는 다음과 같습니다.

public class stats
{
    public string time { get; set; }
    public string value { get; set; }
}

public class ViewerStatsFormat
{
    public List<stats> viewerstats { get; set; }
    public String version { get; set; }

    public ViewerStatsFormat(bool chk)
    {
        this.viewerstats = new List<stats>();
    }
}

이 클래스의 한 개체는 다음으로 채워지고 저장됩니다.

 File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);

저장 부분이 제대로 작동하고 파일이 존재하고 채워집니다. 그 후 파일은 다음과 같이 클래스로 다시 읽 힙니다.

    try 
{ 

    ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
    //otherstuff        

}
catch(Exception ex)
{
    //error loging stuff
}

이제 current = 줄에 예외가 있습니다.

{ "값을 구문 분석하는 동안 예기치 않은 문자가 발견되었습니다. e. 경로 '', 줄 0, 위치 0."}

나는 이것이 왜 오는지 모른다. json 파일은 다음과 같습니다-> JSON 링크에서 나를 클릭하십시오.

누구에게 아이디어가 있습니까?


2
제목을 수정했습니다. " 질문 제목에"태그 "를 포함해야합니까? "를 참조하십시오. 여기서 합의는 "아니오, 안됩니다"입니다.
John Saunders 2014

데이터가 무엇이든 항상이 문제에 직면합니까? 이러한 문제에 직면했을 때 그 이유는 서비스가 잘못된 UTF-8 문자를 전송했기 때문입니다.
ankhuri 2014

@JohnSaunders 죄송합니다. 추가 질문을 위해 내 보관할 것입니다 :).
zAfLu 2014

1
@ankhuri 그냥 ... 파일에서 읽어 내 잘못 잊어
zAfLu

그게 문제가 아니라고 가정하면, 또 뭐죠? recv 예외-> { "topic": "robot1 / Log", "Msg": "Pilot Running"} 값을 구문 분석하는 동안 예기치 않은 문자가 발견되었습니다. o. 경로 '', 행 0, 위치 0.
Spiked3 2015 년

답변:


149

아마도 JSON을 DeserializeObject.

그것은에서 모양 File.WriteAllText(tmpfile,...의 유형 tmpfileIS string파일의 경로가 포함되어 있습니다. JsonConvert.DeserializeObject파일 경로가 아닌 JSON 값을 사용하므로 @"c:\temp\fooo"JSON이 아닌 것과 같은 변환을 시도 하지 못합니다.


75

다음 온라인 도구로 문제를 해결했습니다.

  1. Json 구조가 OKAY인지 확인하려면 : http://jsonlint.com/
  2. 내 Json 구조에서 내 Object 클래스를 생성하려면 : https://www.jsonutils.com/

간단한 코드 :

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));

2
check if the Json structureC #에서 OKAY 방법 은 무엇입니까?
Kiquenet

1
아마도 여기의 aswers가 당신을 도울 수있을 것입니다 : stackoverflow.com/questions/14977848/…
Edu Pelais

2
감사합니다. json2csharp.com 은 저에게 생명의 은인이었습니다. 이를 사용하면 올바른 클래스가 어떤 모습이어야하는지 역 설계 할 수 있습니다. 다시 한 번 감사드립니다!
Aamir

1
json2csharp.com 링크가 더 이상 작동하지 않습니다. 대신 jsonutils.com 을 사용하는 것이 좋습니다 .
Stijn

@Stijn의 제안으로 깨진 URL을 새 URL로 변경했습니다.
Edu Pelais

14

내 Xamarin.Android 솔루션에서 동일한 오류가 발생했습니다.

내 JSON이 올바른지 확인했고 앱을 릴리스 빌드로 실행할 때만 오류가 나타나는 것을 확인했습니다.

링커가 Newtonsoft.JSON에서 라이브러리를 제거하여 JSON이 잘못 구문 분석되는 것으로 밝혀졌습니다.

Android 빌드 구성의 어셈블리 무시 설정에 Newtonsoft.Json을 추가하여 오류를 수정했습니다 (아래 스크린 샷).

JSON 구문 분석 코드

static readonly JsonSerializer _serializer = new JsonSerializer();
static readonly HttpClient _client = new HttpClient();

static async Task<T> GetDataObjectFromAPI<T>(string apiUrl)
{
    using (var stream = await _client.GetStreamAsync(apiUrl).ConfigureAwait(false))
    using (var reader = new StreamReader(stream))
    using (var json = new JsonTextReader(reader))
    {
        if (json == null)
            return default(T);

        return _serializer.Deserialize<T>(json);
    }
}

Visual Studio Mac 스크린 샷

여기에 이미지 설명 입력

Visual Studio 스크린 샷

여기에 이미지 설명 입력


xamarin.forms driod 앱용 Visual Studio에서 어떻게 할 수 있습니까?
Mike Darwish 2017

1
@MikeDarwish 나는 Visual Studio에서이 작업을 수행하는 방법을 보여주는 스크린 샷 추가
브랜든 Minnick을

9

나는 또한 바인딩 된 웹 API (닷넷 코어 3.0) 액션이 오류가 발생한 string대신 objectJObject. JSON이 올바르지 만 바인더가 JSON 구조에서 문자열을 가져 오려고했으나 실패했습니다.

따라서 대신 :

[HttpPost("[action]")]
public object Search([FromBody] string data)

더 구체적으로 사용해야했습니다.

[HttpPost("[action]")]
public object Search([FromBody] JObject data)

이것은 .Net Core 2.0에서 나에게 속임수를
썼다.

그것은 나에게도 골칫거리 였지만 모든 json은 키-값 쌍이고 json을 해당 클래스의 인스턴스에 올바르게 매핑하려면 속성이있는 클래스를 키로 제공해야하기 때문에 이치에
맞습니다


5

이 문제는 JSON 파일의 바이트 순서 표시와 관련이 있습니다. JSON 파일은 저장할 때 UTF8 인코딩 데이터로 인코딩되지 않습니다. File.ReadAllText(pathFile)이 문제 를 수정하십시오.

Byte 데이터에 대해 작업하고이를 문자열로 변환 한 다음 JsonConvert.DeserializeObject에 전달할 때 UTF32 인코딩을 사용하여 문자열을 가져올 수 있습니다.

byte[] docBytes = File.ReadAllBytes(filePath);

string jsonString = Encoding.UTF32.GetString(docBytes);


3

ASP.NET core에서 webapi와 동일한 문제가 발생했습니다. 제 경우에는 응용 프로그램에 인증이 필요하기 때문에 주석을 할당하고 [AllowAnonymous]작동했습니다.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}

나는 이것에 대한 파티에 늦었지만 이것도 내 문제였습니다. 내 Deserialize 메서드로 들어가는 "json"을 검사 할 때 API로 인증을 시도하는 것으로 나타났습니다.
Ben

1

이것이 당신의 json이라고 가정하십시오.

{
  "date":"11/05/2016",
  "venue": "{\"ID\":12,\"CITY\":Delhi}"
}

다시 deserialize 장소를 원한다면 아래와 같이 json을 수정하십시오.

{
  "date":"11/05/2016",
  "venue": "{\"ID\":\"12\",\"CITY\":\"Delhi\"}"
}

그런 다음 장소의 가치를 취하여 각 클래스로 역 직렬화를 시도하십시오.


1
안녕하세요, 저는 JsonConvert.SerializeObject를 사용하고 있습니다. 그러면 첫 번째 결과가 생성됩니다. 두 번째 결과는 어떻게 얻습니까?
user123456

이것은 질문에 대한 대답이 아닙니다.
Brian Rogers

1

내 시나리오에서는 선과 위치가 0이 아닌 약간 다른 메시지가있었습니다.

E. 경로 'job [0] .name', 줄 1, 위치 12.

이것은 내가 인용 한 메시지에 대한 최고의 Google 답변이었습니다.

이것은 Windows 명령 줄에서 프로그램을 호출하여 JSON을 매개 변수로 전달했기 때문에 발생했습니다.

내 프로그램에서 인수를 검토 할 때 모든 큰 따옴표가 제거되었습니다. 그것들을 재구성해야합니다.

여기 에 솔루션을 게시했습니다 . 아마도 Regex로 향상 될 수 있습니다.


1

나는 비슷한 오류가 있었고 누군가 비슷한 것을 가지고 있다면 대답 할 것이라고 생각했습니다. json 파일 디렉토리를 반복하고 역 직렬화했지만 동일한 오류가 발생했습니다.

문제는 숨겨진 파일도 잡으려고한다는 것입니다. 전달하는 파일이 .json 파일인지 확인하십시오. 나는 그것이 텍스트도 처리 할 것이라고 생각한다. 도움이 되었기를 바랍니다.


1

제 경우에는 JsonConvert.PopulateObject () 오류가 발생했습니다 . 내 요청은 '[]'대괄호의 추가 쌍으로 래핑 된 JSON을 반환하여 결과를 객체가 아닌 하나 의 객체로 구성했습니다. 다음은 이러한 괄호 안에 들어가기 위해 수행 한 작업입니다 (해당 유형의 모델에만 해당).

           T jsonResponse = new T();
                var settings = new JsonSerializerSettings
                {
                    DateParseHandling = DateParseHandling.DateTimeOffset,
                    NullValueHandling = NullValueHandling.Ignore,
                };
                var jRslt = response.Content.ReadAsStringAsync().Result;
                if (jsonResponse.GetType() == typeof(myProject.Models.myModel))
                {
                    var dobj = JsonConvert.DeserializeObject<myModel[]>(jRslt);
                    var y = dobj.First();
                    var szObj = JsonConvert.SerializeObject(y);
                    JsonConvert.PopulateObject(szObj, jsonResponse, settings);
                }
                else
                {
                    JsonConvert.PopulateObject(jRslt, jsonResponse);
                }

1

URL을 사용하여 데이터 다운로드를 사용하는 경우 ...

var result = client.DownloadData(url);

0

클라이언트와 서버간에 공유 한 모델이 동일한 지 확인하십시오. 때때로 Api 버전을 업데이트하지 않고 업데이트 된 모델을 반환하지만 여전히 이전 모델이있는 경우이 오류가 발생합니다. 직렬화 / 역 직렬화하는 것이 유효한 JSON이 아닌 경우가 있습니다.


-1

토큰을 얻기 위해 webApi에 요청을 보낼 때 Xamarin 양식 에서 유사한 오류 메시지에 직면했습니다 .

  • Json 파일의 모든 키 ( key : value) (예 : 'username', 'password', 'grant_type')가 webApi가 예상하는 것과 정확히 일치하는지 확인하십시오. 그렇지 않으면이 예외가 발생합니다.

처리되지 않은 예외 : Newtonsoft.Json.JsonReaderException : 값을 구문 분석하는 동안 예기치 않은 문자가 발생했습니다 : <. 경로 '', 행 0, 위치 0


-3

비슷한 문제가 발생했을 때 요청에서 로 대체 &mode=xml하여 수정했습니다 &mode=json.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.