解析值时遇到意外字符


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

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

 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字符。
ankhuri 2014年

@JohnSaunders对此表示抱歉。会将其保留在我的手机中,以解决其他问题:)。
zAfLu 2014年

1
@ankhuri只是忘了读文件...我的错
zAfLu 2014年

假设这不是问题,还有什么?recv异常-> {“ topic”:“ robot1 / Log”,“ Msg”:“飞行员正在运行”}解析值:o时遇到意外字符。路径“”,第0行,位置0
Spiked3

Answers:


149

可能您没有将JSON传递给DeserializeObject

它看起来像从File.WriteAllText(tmpfile,...该类型tmpfile就是string包含文件路径。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 '18

1
也许这里的aswers可以帮助你:stackoverflow.com/questions/14977848/...
埃杜Pelais

2
谢谢。json2csharp.com对我来说是个救命稻草。使用它,您可以反向工程回正确的类外观。再次感谢!
Aamir

1
链接json2csharp.com不再起作用。我建议改用jsonutils.com
Stijn

我将损坏的网址更改为新网址,作为您的建议@Stijn。
Edu Pelais

14

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

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

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

我通过将Newtonsoft.Json添加到Android Build Configuration中的“忽略程序集”设置中来修复该错误(以下屏幕截图)

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

在此处输入图片说明


在xamarin.forms driod应用程序的Visual Studio上,我该怎么做?
Mike Darwish

1
@MikeDarwish我添加了一个屏幕截图,显示了如何在Visual Studio中完成此操作
Brandon Minnick

9

我也遇到过这个错误对Web API(.NET 3.0的核心)的行动,是有约束力的string,而不是一个object或一个JObject。JSON是正确的,但是活页夹试图从JSON结构中获取字符串,但失败了。

因此,代替:

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

我不得不使用更具体的:

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

这在.Net Core 2.0上对我起到了欺骗作用,发布于Postman
Vitox

我也很头疼,但这是有道理的,因为每个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​​进行身份验证。

1

假设这是您的json

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

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

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

然后尝试利用会场的价值反序列化到各个班级


1
嗨,我正在使用JsonConvert.SerializeObject,它将从我这里产生第一个结果,我如何获得第二个结果呢?
user123456

这不能回答所提出的问题。
Brian Rogers

1

在我的场景中,我有一条稍微不同的消息,即行和位置都不为零。

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

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

发生这种情况是因为我从Windows命令行调用了程序,并将JSON作为参数传递。

当我检查程序中的参数时,所有双引号都被删除了。您必须重新构造它们。

我在这里发布了解决方案。尽管使用Regex可能会增强它。


1

我有一个类似的错误,并认为如果有人有类似的问题我会回答。我正在遍历json文件的目录并反序列化它们,但是却遇到了同样的错误。

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


1

就我而言,我在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);
                }

1

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

var result = client.DownloadData(url);

0

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


-1

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

  • 确保Json文件中的所有键(:值)(例如,“用户名”,“密码”,“ grant_type”)均与webApi期望的完全相同,否则会引发此异常。

未处理的异常:Newtonsoft.Json.JsonReaderException:解析值<时遇到意外字符。路径'',第0行,位置0


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.