目前我有一些问题。我正在使用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
有没有人有任何想法?
可能你没有将JSON传递给DeserializeObject
。
看起来像File.WriteAllText(tmpfile,...
那种类型的tmpfile
是包含文件路径的string
。 JsonConvert.DeserializeObject
采用JSON值,而不是文件路径 - 因此它无法尝试转换像@"c:\temp\fooo"
这样的东西 - 显然不是JSON。
在向Web Api发送请求以获取令牌时,我在Xamarin表单中遇到类似的错误消息,
未处理的异常:Newtonsoft.Json.JsonReaderException:解析值时遇到意外的字符:<。路径'',第0行,第0位
当我遇到类似的问题时,我通过在请求中用&mode=xml
替换&mode=json
来修复它。
我用这些在线工具解决了这个问题:
简单的代码:
RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));
我在Xamarin.Android解决方案中遇到了同样的错误。
我验证了我的JSON是正确的,并注意到只有当我将应用程序作为Release版本运行时才会出现错误。
原来,Linker正在从Newtonsoft.JSON中删除一个库,导致JSON被错误地解析。
我通过将Newtonsoft.Json添加到Android Build Configuration中的Ignore程序集设置来修复错误(下面的屏幕截图)
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);
}
}
此问题与JSON文件中的字节顺序标记有关。保存时,JSON文件不会编码为UTF8编码数据。使用File.ReadAllText(pathFile)
解决了这个问题。
当我们对字节数据进行操作并将其转换为字符串然后传递给JsonConvert.DeserializeObject时,我们可以使用UTF32编码来获取字符串。
byte[] docBytes = File.ReadAllBytes(filePath);
string jsonString = Encoding.UTF32.GetString(docBytes);
假设这是你的json
{
"date":"11/05/2016",
"venue": "{\"ID\":12,\"CITY\":Delhi}"
}
如果你再想要反序列化场地,修改json如下
{
"date":"11/05/2016",
"venue": "{\"ID\":\"12\",\"CITY\":\"Delhi\"}"
}
然后尝试通过取得场地的价值反序列化到各自的班级
我在ASP.NET核心中遇到了与webapi相同的问题,在我的情况下,这是因为我的应用程序需要身份验证,然后它分配注释[AllowAnonymous]
并且它有效。
[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
}
如果您使用url下载数据...可能需要使用
var result = client.DownloadData(url);
请检查您在客户端和服务器之间共享的模型是否相同。有时,当您没有更新Api版本并且它返回更新的模型时,您会收到此错误,但您仍然有一个旧版本。有时你得到序列化/反序列化的东西不是有效的JSON。
在我的场景中,我的消息略有不同,其中行和位置不为零。
E.路径'job [0] .name',第1行,第12位。
对于我引用的消息,这是谷歌的最佳答案。
这是因为我从Windows命令行调用了一个程序,并将JSON作为参数传递。
当我查看程序中的args时,所有双引号都被删除了。你必须重组它们。
我发布了一个解决方案here。虽然它可以通过正则表达式进行增强。