値の解析中に予期しない文字が見つかりました


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>();
    }
}

このクラスの1つのオブジェクトは、以下で埋められて保存されます。

 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
タイトルを編集しました。コンセンサスが「いいえ、彼らはすべきではない」である「質問にはタイトルに「タグ」を含める必要がありますか?」を参照してください。
ジョンサンダース

データに関係なく、常にこの問題に直面していますか?かつてこのような問題に直面したのは、サービスが無効なUTF-8文字を送信していたからです。
アンクリ14

@JohnSaunders、ごめんなさい。さらなる質問のためにそれを私の中に保ちます:)。
zAfLu 2014

1
@ankhuriがファイルを読み取るのを忘れた...私のせい
zAfLu

それが問題ではないと仮定すると、他に何がありますか?recv Exception-> {"topic": "robot1 / Log"、 "Msg": "Pilot Running"}値の解析中に予期しない文字が発生しました:o。パス「」、行0、位置0
Spiked3

回答:


149

おそらく、JSONをに渡していない可能性がありますDeserializeObject

File.WriteAllText(tmpfile,...そのタイプからtmpfilestring、ファイルへのパスが含まれているように見えます。JsonConvert.DeserializeObjectファイルパスではなくJSON値を取ります。そのため、次のような変換に失敗します@"c:\temp\fooo"-これは明らかにJSONではありません。


75

これらのオンラインツールで問題を解決しました:

  1. Json構造に問題がないかどうかを確認するには:http ://jsonlint.com/
  2. Json構造からObjectクラスを生成するには:https ://www.jsonutils.com/

簡単なコード:

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

2
ハウツー check if the Json structureはC#でOKAYですか?
Kiquenet

1
おそらく、ここaswersはあなたを助けることができる:stackoverflow.com/questions/14977848/...
エドゥ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スクリーンショット

ここに画像の説明を入力してください


Visual Studio for xamarin.forms driod appでそれを行う方法
マイクダーウィッシュ2017

1
@MikeDarwish Visual Studioでこれを実現する方法を示すスクリーンショットを追加しました
Brandon Minnick '28

9

私はまたに結合されたWeb API(.NET 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をそのクラスのインスタンスに正しくマッピングするには、キーとしてプロパティを持つクラスを提供する必要があるため、理にかなっています
Eugene Zakharov


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コアのwebapiで同じ問題が発生しました。私の場合、それは私のアプリケーションが認証を必要[AllowAnonymous]としているためでした。それから、注釈を割り当てて機能しました。

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

私はこれでパーティーに遅れましたが、これも私の問題でした。Deserializeメソッドに入る「json」を調べると、APIで認証しようとしていることがわかりました。
Ben

1

これがあなたのjsonだとしましょう

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

場所を逆シリアル化する場合は、jsonを以下のように変更します

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

次に、ベニューの価値を利用して、各クラスにデシリアライズしてみます


1
こんにちは、私はJsonConvert.SerializeObjectを使用しています。これにより、最初の結果が生成されます。どうすれば2番目の結果を取得できますか?
user123456 2016

これは、尋ねられた質問には答えません。
ブライアンロジャース

1

私のシナリオでは、線と位置がゼロではなかった少し異なるメッセージがありました。

E.パス 'job [0] .name'、行1、位置12。

これが、私が引用したメッセージに対するGoogleの回答のトップでした。

これは、Windowsのコマンドラインからプログラムを呼び出し、パラメーターとしてJSONを渡していたためです。

プログラムの引数を確認すると、すべての二重引用符が削除されています。それらを再構成する必要があります。

ここに解決策を投稿しました。それはおそらく正規表現で強​​化することができますが。


1

私は同様のエラーがあり、誰かが同じようなものを持っている場合に備えて答えると思いました。私はjsonファイルのディレクトリをループしてデシリアライズしていましたが、同じエラーが発生していました。

問題は、隠しファイルも取得しようとしていたことです。渡すファイルが.jsonファイルであることを確認してください。テキストも処理できると思います。お役に立てれば。


1

私の場合、JsonConvert.PopulateObject()でエラーが発生しました。私のリクエストは、追加の '[]'ブラケットのペアでラップされたJSONを返し、結果を単なるオブジェクトではなく1つのオブジェクトの配列にしました。これらのブラケットの中に入るために私がしたことは次のとおりです(そのタイプのモデルのみ):

           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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.