解析值时遇到意外字符

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

{“解析值时遇到意外字符: 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>();
}
}

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

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

保存部分工作正常,文件存在并已填充。之后,该文件将被读回到类中,具体方法如下:

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

现在在 current = line 上出现了一个例外:

{“解析值时遇到意外字符: e. 路径”,第0行,位置0。”}

我不知道为什么会这样。 JSON 文件如下-> 单击我,我是 JSON 链接

有人知道吗?

738536 次浏览

可能您没有将 JSON 传递给 DeserializeObject

File.WriteAllText(tmpfile,...看来,tmpfile的类型是包含文件路径的 stringJsonConvert.DeserializeObject采用 JSON 值,而不是文件路径-所以它无法尝试转换类似 @"c:\temp\fooo"的东西-这显然不是 JSON。

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

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

简单的代码:

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

假设这是你的儿子

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

如果您再次想要反序列化地点,修改 json 如下

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

然后尝试反序列化到各自的类采取场地的价值

当我遇到类似的问题时,我通过在请求中用 &mode=xml代替 &mode=json来修复它。

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

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

事实证明,链接器正在从 Newtonsoft.JSON 中删除一个库,导致 JSON 被错误地解析。

我通过加入牛顿软件修正了这个错误。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 屏幕截图

enter image description here

Visual Studio 截图

enter image description here

如果您正在使用 url 下载数据,可能需要使用

var result = client.DownloadData(url);

这个问题与 JSON 文件中的 Byte Order Mark 有关。保存 JSON 文件时,不将其编码为 UTF8编码数据。使用 File.ReadAllText(pathFile)修复这个问题。

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

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

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

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

  • 确保所有键(钥匙: 值)(ex。Json 文件中的‘ username’、‘ password’、‘ Grant _ type’)正是 webApi 所期望的,否则它将触发此异常。

未处理的异常: Newtonsoft.Json.JsonReaderException: 解析值时遇到意外字符: < . Path”,行0,位置0

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

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

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

在我的场景中,我有一个稍微不同的消息,其中的线和位置不是零。

路径‘ job [0] . name’,第1行,位置12。

这是我引用的信息在谷歌上的最佳答案。

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

当我检查程序中的参数时,所有的双引号都被去掉了。 你必须重组它们。

我发布了一个解决方案 给你。虽然它可能会增强与正则表达式。

我也犯过类似的错误,所以我觉得应该回答一下,以防有人也犯了类似的错误。我正在遍历一个 json 文件目录并反序列化它们,但是得到了同样的错误。

问题是它也试图获取隐藏文件。确保要传入的文件是。Json 文件。我猜它也能处理短信。希望这个能帮上忙。

在我的例子中,我在 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);
}

我还遇到过 Web API (。Net Core 3.0)操作,该操作绑定到 string,而不是 objectJObject。JSON 是正确的,但是绑定器试图从 JSON 结构中获取一个字符串,但是失败了。

所以,不是:

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

我不得不使用更具体的:

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

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

enter image description here

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

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

我最后是这么做的:

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

这解决了我的问题。

在我的例子中,缺少默认的无参数构造函数! ! !

在我的例子中,我在调用异步服务方法时没有使用 wait,因此在 Task 完成之前,我试图返回结果!

我也有同样的问题。在我的情况下,问题是在 DateTime格式。它只是数字,也被称为 EpochFormat 或 UnixTimestamp。 我的 JSON 中的一部分:

"direction": "outbound",
"date_archive": 1554691800224,
"date_doc": 1524700800000,
"date_sent": 1524704189000,
"date_received": 1524704189000,
"date_store_till": 1712544600224,

所以我使用了这样一个属性:

[JsonProperty("date_received")]
[JsonConverter(typeof(MicrosecondEpochConverter))]
public DateTime? DateReceived { get; set; }

你可以在这里找到 MicrosecondEpochConverter代码: https://stackoverflow.com/a/19972214/4324624