2017-10-12 7 views
0

データベースから文字列として保存されたJSONデータを読み込もうとしていますが、別の方法でデータを変換する必要があります。私はエラーがJSON.NETによってJsonTextReaderから内部的にスローされるのを見ました。私は直接次のコードを使用してエラーを再現しようとしました。このコードで何が問題になっていますか?JsonTextReaderを使用してJSONを読み取るとエラーが発生します

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

これは、エラーがスローされます:

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

答えて

2

あなたは間違ってJsonTextReaderを使用しているので、あなたがエラーを取得しています。

JsonTextReaderクラスは、一度に1つずつ読み込まれる一連の「トークン」としてJSON文字列を処理します。可能なトークンは、いくつかの名前にStartObjectStartArrayPropertyNameStringIntegerBooleanNullEndObject、およびEndArray含むJsonToken列挙、によって定義されています。

ReadAsStringを呼び出すと、リーダーは次のトークンに進み、そのトークンを文字列として解釈しようとします。 JSONでは、最初のトークンは文字列ではありません。 StartObject(左中括弧{に対応)です。 ReadAsStringはこれを期待していないため、エラーが発生します。

ReadAs...のメソッドは、読者が直面する次のトークンが特定のタイプ(文字列など)になることを既に知っている場合にのみ有効です。あらかじめJSON構造体がわからず、JsonTextReaderをスキャンしたい場合は、Readメソッドを呼び出してfalseを返すようにしてください。各Readコールは、リーダーを次のトークンに進め、TokenTypeValueのプロパティを設定します。 TokenTypeを確認して、Valueの処理方法を確認できます。

JsonTextReaderを使用してJSONをループスルーし、各ステップで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)")); 
} 

フィドル:ここhttps://dotnetfiddle.net/nxWd1X

を出力します:

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

JsonTextReaderは覚えておいてください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を文字列として読み込み、逆シリアル化することでした。実際の実装でJSON形式でデータを格納するデータストアからデータを取得する必要があるインターフェイスでは、一般的な 'Task Get (key)'メソッドを実装する必要があります。 TがStringの場合は、 'JSONConvert.DeserilaizeObject (string)'を使用しています。これは、このエラーが発生する場所です。 –

関連する問題