【问题标题】:Unexpected character encountered while parsing value解析值时遇到意外字符
【发布时间】:2014-06-09 03:56:30
【问题描述】:

目前,我有一些问题。我在 Json.NET 中使用 C#。问题是我总是得到:

{"解析值时遇到意外字符:e.Path '', line 0, position 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>();
    }
}

这个类的一个对象将被填充和保存:

 File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);

保存部分工作正常,文件存在并已填充。之后,该文件将被读回类中:

try 
{ 
    ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
    //otherstuff        
}
catch(Exception ex)
{
    //error loging stuff
}

现在在 current= 行出现了异常:

{"解析值时遇到意外字符:e.Path '', line 0, position 0."}

我不知道为什么会这样。 JSON文件如下 -> Click me I am the JSON link

有人有什么想法吗?

【问题讨论】:

  • 无论数据如何,您是否总是面临这个问题?有一次我遇到这样的问题,原因是服务发送了无效的 UTF-8 字符。
  • @ankhuri 只是忘记读取文件...我的错
  • 假设这不是问题,还有什么? recv Exception-> {"topic":"robot1/Log","Msg":"Pilot Running"} 解析值时遇到意外字符:o。路径'',第 0 行,第 0 位置。
  • 如何将其作为异常处理?
  • 我找到了上面的答案。 stackoverflow.com/a/55951414/495157

标签: c# json visual-studio-2013 json.net


【解决方案1】:

您可能没有将 JSON 传递给 DeserializeObject

File.WriteAllText(tmpfile,... 看来,tmpfile 的类型是 string,其中包含文件路径。 JsonConvert.DeserializeObject 采用 JSON 值,而不是文件路径 - 因此尝试转换 @"c:\temp\fooo" 之类的内容失败 - 这显然不是 JSON。

【讨论】:

  • 我使用 JsonConvert.DeserializeObject 来反序列化字符串而不是 json 的响应。因此它抛出了上述错误。
【解决方案2】:

我用这些在线工具解决了这个问题:

  1. 检查Json结构是否OKAY:http://jsonlint.com/
  2. 从我的 Json 结构生成我的 Object 类:https://www.jsonutils.com/

简单代码:

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

【讨论】:

【解决方案3】:

在我的例子中,包含 JSON 字符串的文件有 BOM。一旦我删除了 BOM,问题就解决了。

【讨论】:

  • 我遇到了类似的问题——但是 VS2019 解析了 launchSettings.json 文件——并且不得不将它从 UTF-8-BOM 更改为 UTF-8。
  • 如果你有幸成为编写 JSON 的人,你可以防止 BOM 被这样写:“using (var streamWriter = new StreamWriter(someStream, new UTF8Encoding(false) )) ..."
【解决方案4】:

我在 Xamarin.Android 解决方案中遇到了同样的错误。

我验证了我的 JSON 是正确的,并注意到该错误仅在我将应用程序作为发布版本运行时出现。

原来链接器正在从 Newtonsoft.JSON 中删除一个库,导致 JSON 解析不正确。

我通过将 Newtonsoft.Json 添加到 Android 构建配置中的忽略程序集设置来修复错误(下面的屏幕截图)

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 屏幕截图

【讨论】:

    【解决方案5】:

    对于绑定到 string 而不是 objectJObject 的 Web API (.Net Core 3.0) 操作,我也遇到了此错误。 JSON 是正确的,但 binder 尝试从 JSON 结构中获取字符串并失败。

    所以,而不是:

    [HttpPost("[action]")]
    public object Search([FromBody] string data)
    

    我不得不使用更具体的:

    [HttpPost("[action]")]
    public object Search([FromBody] JObject data)
    

    【讨论】:

    • 这对我来说也很头疼,但这是有道理的,因为每个 json 都是一个键值对,您应该提供一个具有属性作为键的类,以正确地将 json 映射到该类的实例
    • 这值得我投超过 1 票!在偶然发现你的小费之前,我花了几个小时考虑放弃一项特定的锻炼。
    【解决方案6】:

    此问题与 JSON 文件中的字节顺序标记有关。 JSON 文件在保存时未编码为 UTF8 编码数据。使用File.ReadAllText(pathFile) 修复此问题。

    当我们对 Byte 数据进行操作并将其转换为字符串然后传递给 JsonConvert.DeserializeObject 时,我们可以使用 UTF32 编码来获取字符串。

    byte[] docBytes = File.ReadAllBytes(filePath);

    string jsonString = Encoding.UTF32.GetString(docBytes);

    【讨论】:

      【解决方案7】:

      我在 ASP.NET 核心中使用 webapi 时遇到了同样的问题,在我的情况下,这是因为我的应用程序需要身份验证,然后它分配注释 [AllowAnonymous] 并且它起作用了。

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

      【讨论】:

      • 我迟到了,但这也是我的问题。在检查进入我的 Deserialize 方法的“json”时,它表明它正在尝试使用 API 进行身份验证。
      【解决方案8】:

      在我的场景中,我收到的消息略有不同,其中行和位置不为零。

      E.路径“job[0].name”,第 1 行,位置 12。

      这是我引用的消息的最佳 Google 答案。

      这是因为我从 Windows 命令行调用了一个程序,将 JSON 作为参数传递。

      当我查看程序中的 args 时,所有的双引号都被去掉了。 你必须重构它们。

      我发布了一个解决方案here。虽然它可能可以通过正则表达式来增强。

      【讨论】:

        【解决方案9】:

        我遇到了类似的错误,我想我会回答,以防有人遇到类似的情况。我正在循环一个 json 文件目录并反序列化它们,但遇到了同样的错误。

        问题在于它也试图抓取隐藏文件。确保您传入的文件是 .json 文件。我猜它也会处理文本。希望这可以帮助。

        【讨论】:

          【解决方案10】:

          就我而言,我在 JsonConvert.PopulateObject() 上遇到错误。 我的请求返回的 JSON 被包裹在一对额外的 '[ ]' 括号中,使我的结果成为 一个对象的数组 而不仅仅是一个对象。以下是我为进入这些括号所做的工作(仅适用于该类型的模型):

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

          【讨论】:

            【解决方案11】:

            如果你正在使用使用url下载数据...可能需要使用

            var result = client.DownloadData(url);
            

            【讨论】:

              【解决方案12】:

              我遇到了这个问题,最终是因为我的输入字符串中的 BOM 字符。

              这是我最终做的:

              String.Trim(new char[] { '\uFEFF', '\u200B' });
              

              这为我解决了这个问题。

              【讨论】:

                【解决方案13】:

                假设这是你的 json

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

                如果你想再次反序列化场地,修改json如下

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

                然后尝试通过取场地的值来反序列化到相应的类

                【讨论】:

                • 嗨,我正在使用 JsonConvert.SerializeObject,它会产生第一个结果,我如何获得第二个?
                • 这没有回答所提出的问题。
                【解决方案14】:

                在向 webApi 发送请求以获取令牌时,我在 Xamarin 表单 中遇到了类似的错误消息,

                • 确保 Json 文件中的所有键 (key : value) (ex.'username', 'password', 'grant_type') 正是 webApi 所期望的,否则会触发此异常.

                未处理的异常:Newtonsoft.Json.JsonReaderException:解析值时遇到意外字符:

                【讨论】:

                  【解决方案15】:

                  请检查您在客户端和服务器之间共享的模型是否相同。有时,当您未更新 Api 版本并返回更新的模型时,您会收到此错误,但您仍然有一个旧模型。有时你会得到你序列化/反序列化的不是有效的 JSON。

                  【讨论】:

                    【解决方案16】:

                    当我们将 json 内容解析为模型对象时会发生此错误。 Json 内容类型是字符串。 例如: https://dotnetfiddle.net/uFClKj 有时,我们调用的 api 可能会返回错误。如果我们不检查响应状态,而是继续将响应解析到模型,就会出现这个问题。

                    【讨论】:

                      【解决方案17】:

                      就我而言,是缺少默认的无参数构造函数!!!

                      【讨论】:

                        【解决方案18】:

                        在我的例子中,我是在不使用 await 的情况下调用异步服务方法,所以在 Task 完成之前我试图返回结果!

                        【讨论】:

                          【解决方案19】:

                          当我遇到类似问题时,我通过在请求中将 &amp;mode=xml 替换为 &amp;mode=json 来修复它。

                          【讨论】:

                            猜你喜欢
                            • 2016-02-24
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-08-30
                            • 1970-01-01
                            • 2020-05-09
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多