あなたは間違ってJsonTextReader
を使用しているので、あなたがエラーを取得しています。
JsonTextReader
クラスは、一度に1つずつ読み込まれる一連の「トークン」として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
の処理方法を確認できます。
JsonTextReader
を使用してJSONをループスルーし、各ステップで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)"));
}
フィドル:ここ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
}
ありがとうございます。私はそれを理解した。私の意図は、完全なJSONを文字列として読み込み、逆シリアル化することでした。実際の実装でJSON形式でデータを格納するデータストアからデータを取得する必要があるインターフェイスでは、一般的な 'Task Get (key)'メソッドを実装する必要があります。 TがStringの場合は、 'JSONConvert.DeserilaizeObject (string)'を使用しています。これは、このエラーが発生する場所です。 –