:
var rs = new Newtonsoft.Json.JsonTextReader(new System.IO.StringReader("{'1':'2'}"));
rs.ReadAsString();
그것은 오류가 발생합니다.
JsonTextReader
클래스는 JSON 문자열을 한 번에 하나씩 읽는 일련의 "토큰"으로 처리합니다. 가능한 토큰은 StartObject
이 StartArray
, PropertyName
, String
, Integer
, Boolean
, Null
, EndObject
및 EndArray
는 몇 가지 이름을 포함하여 JsonToken
열거에 의해 정의됩니다.
ReadAsString
을 호출하면 판독기가 다음 토큰으로 이동하고 해당 토큰을 문자열로 해석하려고 시도합니다. JSON에서 첫 번째 토큰은 문자열이 아닙니다. StartObject
(왼쪽 중괄호 {
에 해당)입니다. ReadAsString
이이를 예상하지 않으므로 오류가 발생합니다.
ReadAs...
메서드는 실제로 독자가 만날 다음 토큰이 특정 유형 (예 : 문자열)임을 미리 알고있는 경우에만 유용합니다. JSON 구조체를 미리 알지 못했고 JsonTextReader
을 스캔하여 스캔하려는 경우 Read
메서드를 호출하여 false가 반환 될 때까지 반복 할 수 있습니다. 각 Read
호출은 판독기를 다음 토큰으로 진행시키고 TokenType
및 Value
속성을 설정합니다. 그런 다음 TokenType
을 확인하여 Value
을 처리하는 방법을 결정할 수 있습니다. 여기
는 JSON을 통해 루프로
JsonTextReader
를 사용하고 각 단계에서
TokenType
및
Value
을 덤프 간단한 예이다. 독자가 당신의 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
}
감사합니다. 나는 그것을 알아 냈다.제 의도는 JSON을 문자열로 읽고 Deserialize하는 것이 었습니다. 실제 구현시 JSON 형식의 데이터를 저장하는 데이터 저장소에서 데이터를 가져와야하는 인터페이스의 경우 일반적인 '작업 Get (키)'메서드를 구현해야합니다. 대부분 JSON 형식의 직렬화 된 객체이지만 때로는 또한 T가 String 인 곳에서 읽기 문자열을 반환합니다.이 경우 JSONConvert.DeserilaizeObject (string)'을 사용했습니다. 즉,이 오류가 발생합니다. –