解析值时遇到意外的字符

时间:2014-04-24 03:16:08

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

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

  

{&#34;解析值时遇到意外的字符:e。路径&#39;&#39;,第0行,第0位。&#34;}

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

有没有人有任何想法?

16 个答案:

答案 0 :(得分:109)

可能您没有将JSON传递给DeserializeObject

File.WriteAllText(tmpfile,...开始,tmpfile的{​​{1}}类型包含文件路径。 string获取JSON值,而不是文件路径 - 因此它无法尝试转换JsonConvert.DeserializeObject之类的内容 - 这显然不是JSON。

答案 1 :(得分:58)

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

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

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

答案 2 :(得分:11)

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

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

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

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

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

答案 3 :(得分:3)

对于绑定到 gent_code nr_pol percentile <chr> <int> <dbl> 1 E0188 35 0.241 2 S5682 91 0.862 3 O6192 96 0.931 4 E1197 97 1.000 5 Y9358 39 0.345 6 Y0069 63 0.552 7 D2879 14 0.138 8 V6778 25 0.172 9 M6284 75 0.759 10 O3420 69 0.690 11 O2301 35 0.241 12 G1728 3 0.0345 13 T4536 38 0.310 14 E0418 1 0 15 K9373 44 0.414 16 W9335 66 0.621 17 Z4140 58 0.448 18 F1424 62 0.517 19 L9825 96 0.931 20 B8411 59 0.483 21 R0735 41 0.379 22 K8881 81 0.793 23 V9502 87 0.828 24 D9827 5 0.0690 25 J5363 8 0.103 26 M2909 68 0.655 27 D3658 94 0.897 28 J1312 34 0.207 29 Z6347 63 0.552 30 D6342 72 0.724 而不是stringobject的Web API(.Net Core 3.0)操作,我也遇到了此错误。 JSON正确,但是活页夹试图从JSON结构中获取字符串,但失败了。

所以,而不是:

JObject

我必须使用更具体的内容:

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

答案 4 :(得分:2)

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

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

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

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

答案 5 :(得分:1)

假设这是你的json

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

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

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

然后尝试通过获取场地值

来反序列化到相应的班级

答案 6 :(得分:1)

在ASP.NET核心中,我在使用webapi时遇到了同样的问题,在我的情况下,这是因为我的应用程序需要身份验证,然后它分配了注释<Include> <Component Id='_6387aee1c48be620fded05f509eb61ef' Guid='*'> <File Id='_e566fc2d9d74ea7a1249736056b2a2e4' Source='foo\jre\THIRDPARTYLICENSEREADME.txt' Name='THIRDPARTYLICENSEREADME.txt' DiskId='1' /> </Component> <Component Id='_0dcaf4ce39ea5a8ab63704e6e8e23514' Guid='*'> <File Id='_9e93e8a3fced0b6549171fc677dad65c' Source='foo\jre\README.txt' Name='README.txt' DiskId='1' /> </Component> <Component Id='_2fa36d02341dba40d7dd8dabc21aa506' Guid='*'> <File Id='_3654927acd82cae7b37fb9b7c92a6615' Source='foo\jre\release' Name='release' DiskId='1' /> </Component> <Directory Id='_9b3d18d11d414dfb14909186a8ebb330' Name='lib'> <!-- ... --> 并且可以正常工作。

[AllowAnonymous]

答案 7 :(得分:0)

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

  

var result = client.DownloadData(url);

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

在我的情况下,我有一条稍微不同的消息,即行和位置都不为零。

  

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

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

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

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

我发布了一个解决方案here。尽管使用Regex可能会增强它。

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

就我而言,包含JSON字符串的文件具有BOM。删除BOM后,问题就解决了。

enter image description here

答案 14 :(得分:0)

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

答案 15 :(得分:-4)

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