2017-10-12 70 views
0

데이터베이스에서 문자열로 저장된 JSON 데이터를 읽으려고하고 있으며 다른 방식으로 데이터를 변환해야합니다. JsonTextReader에서 JSON.NET에 의해 오류가 발생하는 것을 보았습니다. 다음 코드를 직접 사용하여 오류를 재현하려고했습니다. 이 코드의 문제점은 무엇입니까? 잘못 JsonTextReader을 사용하고 있기 때문에 오류를 얻고있다JsonTextReader를 사용하여 JSON을 읽는 중 오류가 발생했습니다.

Unexpected character encountered while parsing value: {. Path '', line 1, position 1.

답변

2

:

var rs = new Newtonsoft.Json.JsonTextReader(new System.IO.StringReader("{'1':'2'}")); 
rs.ReadAsString(); 

그것은 오류가 발생합니다.

JsonTextReader 클래스는 JSON 문자열을 한 번에 하나씩 읽는 일련의 "토큰"으로 처리합니다. 가능한 토큰은 StartObjectStartArray, PropertyName, String, Integer, Boolean, Null, EndObjectEndArray는 몇 가지 이름을 포함하여 JsonToken 열거에 의해 정의됩니다.

ReadAsString을 호출하면 판독기가 다음 토큰으로 이동하고 해당 토큰을 문자열로 해석하려고 시도합니다. JSON에서 첫 번째 토큰은 문자열이 아닙니다. StartObject (왼쪽 중괄호 {에 해당)입니다. ReadAsString이이를 예상하지 않으므로 오류가 발생합니다.

ReadAs... 메서드는 실제로 독자가 만날 다음 토큰이 특정 유형 (예 : 문자열)임을 미리 알고있는 경우에만 유용합니다. JSON 구조체를 미리 알지 못했고 JsonTextReader을 스캔하여 스캔하려는 경우 Read 메서드를 호출하여 false가 반환 될 때까지 반복 할 수 있습니다. 각 Read 호출은 판독기를 다음 토큰으로 진행시키고 TokenTypeValue 속성을 설정합니다. 그런 다음 TokenType을 확인하여 Value을 처리하는 방법을 결정할 수 있습니다. 여기

는 JSON을 통해 루프로 JsonTextReader를 사용하고 각 단계에서 TokenTypeValue을 덤프 간단한 예이다. 독자가 당신의 JSON을 보는 방법이 당신에게 좋은 아이디어를 줄 것이다 :

JsonTextReader rs = new JsonTextReader(new StringReader("{'1':'2'}")); 

Console.WriteLine("TokenType  Value"); 
Console.WriteLine("------------ ------"); 
while (rs.Read()) 
{ 
    Console.WriteLine(string.Format("{0,-12} {1}", 
     rs.TokenType.ToString(), 
     rs.Value != null ? rs.Value.ToString() : "(null)")); 
} 

바이올린 :

TokenType  Value 
------------ ------ 
StartObject (null) 
PropertyName 1 
String  2 
EndObject  (null) 

명심가 JsonTextReader은 다음과 같습니다

https://dotnetfiddle.net/nxWd1X는 출력 JSON을 파싱하기위한 꽤 낮은 수준의 API이며, 가장 단순한 JSON 구조를 제외한 모든 것에 사용하기 까다로울 수 있습니다. JSON에 잘 알려진 구조가 있다면 일치하는 클래스 (또는 클래스 집합)를 정의하고 JsonConvert.DeserializeObject<T>을 사용하여 역 직렬화하는 것이 더 쉬울 수도 있습니다. 예를 들면 : 당신의 JSON 구조가 잘 알려진 동적 또는없는 경우

public class RootObject 
{ 
    [JsonProperty("1")] 
    public string One { get; set; } 
} 

var root = JsonConvert.DeserializeObject<RootObject>("{'1':'2'}"); 

Console.WriteLine(root.One); // 2 

은 또는, 당신은 LINQ-to-JSON API (JObjects) 대신 사용할 수 있습니다. 예 :

var obj = JObject.Parse("{'1':'2'}"); 
foreach (JProperty prop in obj.Properties()) 
{ 
    Console.WriteLine(prop.Name + ": " + prop.Value); // 1: 2 
} 
+0

감사합니다. 나는 그것을 알아 냈다.제 의도는 JSON을 문자열로 읽고 Deserialize하는 것이 었습니다. 실제 구현시 JSON 형식의 데이터를 저장하는 데이터 저장소에서 데이터를 가져와야하는 인터페이스의 경우 일반적인 '작업 Get (키)'메서드를 구현해야합니다. 대부분 JSON 형식의 직렬화 된 객체이지만 때로는 또한 T가 String 인 곳에서 읽기 문자열을 반환합니다.이 경우 JSONConvert.DeserilaizeObject (string)'을 사용했습니다. 즉,이 오류가 발생합니다. –