解析值时遇到意外的字符

问题描述 投票:75回答:11

目前我有一些问题。我正在使用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 =行上出现异常:

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

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

有没有人有任何想法?

c# json visual-studio-2013 json.net
11个回答
112
投票

可能你没有将JSON传递给DeserializeObject

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


-1
投票

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

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

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


-5
投票

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


62
投票

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

  1. 检查Json结构是否正常:http://jsonlint.com/
  2. 从我的Json结构生成我的Object类:http://json2csharp.com/

简单的代码:

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

11
投票

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

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

原来,Linker正在从Newtonsoft.JSON中删除一个库,导致JSON被错误地解析。

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

JSON Parsing Code

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 Screenshot

enter image description here

Visual Studio Screenshot

enter image description here


2
投票

此问题与JSON文件中的字节顺序标记有关。保存时,JSON文件不会编码为UTF8编码数据。使用File.ReadAllText(pathFile)解决了这个问题。

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

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

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


1
投票

假设这是你的json

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

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

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

然后尝试通过取得场地的价值反序列化到各自的班级


1
投票

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

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

0
投票

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

var result = client.DownloadData(url);


0
投票

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


0
投票

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

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

对于我引用的消息,这是谷歌的最佳答案。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.