【问题标题】:Error JsonTextReader.ReadAsString() C# using json.net错误 JsonTextReader.ReadAsString() C# 使用 json.net
【发布时间】:2015-07-28 10:38:40
【问题描述】:

我是 Json.net 的新用户,但由于出现错误消息而被卡住了。 感谢使用 json.net 的 JsonTextReader,我想读取一个 json 文件 我的 json 文件是我的类 Person 的列表,其中一些属性如下所示: http://pastebin.com/DbSDVt2K 使用 StreamReader(或 TextReader)阅读时,我没有问题。 我想要的是与 JsonTextReader 类型的输出具有相同的结果。

这是我的一段代码,可以帮助您理解: http://pastebin.com/iwF3xuUp

我的错误是:myString = reader.ReadAsString(); " 附加信息:读取字符串时出错。意外标记:StartArray。路径 '',第 1 行,位置 1。"

我一直在寻找更多信息,但没有找到任何可以帮助我的信息。

如果你们中的任何人可以帮助我理解这个错误并找到解决方案。

这是我的 tr 文件内容的摘录:

[
    {
        "FirstName": "X",
        "LastName": "Y",
        "Hobbies": "Cuisine",
        "Age": 35,
        "Country": "France",
        "Address": "unknown",
        "Phone": "unknown",
        "Gender": "male"
    },
    {
        "FirstName": "W",
        "LastName": "Z",
        "Hobbies": "Jouer",
        "Age": 43,
        "Country": "France",
        "Address": "unknown",
        "Phone": "unknown",
        "Gender": "male"
    },
    ...

【问题讨论】:

  • 不确定我是否理解 - 您是否能够反序列化您的数据,只是无法返回 JsonTextReader 类型的文本?
  • @jacoblam 抱歉不清楚。我有一个函数: public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 我正在尝试获取一个 JsonTextReader 以在我的函数中调用它。我只是想知道我的 JsonTextReader 的价值,以查看一切是否顺利。 (因为我是 json.net 的初学者

标签: c# json.net


【解决方案1】:

您只需从您的代码中删除这一行:string myString = reader.ReadAsString(); Json 序列化程序尝试在那里读取一个字符串,但识别出它是您正在尝试读取的一个数组。

TextReader tr = File.OpenText(path);
List<Person> myPersonList = new List<Person>();
JsonTextReader reader = new JsonTextReader(tr);
JsonSerializer jseri = new JsonSerializer();

object parsedData = jseri.Deserialize(reader);

如果您想将其直接转换为正确的类型,您也可以使用通用的 Deserialze 而不是 Deserialize。

您可以将反序列化指定为:

List<Person> parsedData = jseri.Deserialize<List<Person>>(reader);

编辑评论:

如果您想重用 JsonReader,您可以从 JObject 创建阅读器:

JObject o = new JObject
{
    { "Cpu", "Intel" },
    { "Memory", 32 },
    {
        "Drives", new JArray
        {
            "DVD",
            "SSD"
        }
    }
};

JsonReader reader = o.CreateReader();
while (reader.Read())
{
    Console.Write(reader.TokenType);
    if (reader.Value != null)
        Console.Write(" - " + reader.Value);

    Console.WriteLine();
}

示例来自 Newtonsoft 帮助页面的 Using JToken.CreateReader

【讨论】:

  • 感谢您的回答!我还有一个关于 json.net 使用的问题。如果我在做: JObject resultMessage = JObject.Load(reader);使用相同的阅读器,我也有一个错误“附加信息:从 JsonReader 读取 JObject 时出错。当前 JsonReader 项目不是对象:EndArray。路径'',第 1 行,位置 8811。”这就是为什么我想用字符串 myString 进行测试。查看我的 JsonTextReader 的内容。您是否认为我遇到的第二个错误是因为:Json Serializer 尝试读取字符串但识别出一个数组(如您所说)。如果是,有没有办法加载(阅读器)?
  • 请查看我的编辑,但这也只会读取 Json 对象而不是对象数组!
  • 我要去看看你发给我的网站。再次感谢您的准确回答。
【解决方案2】:

只需使用常规 TextReader 读取文件,然后使用 JsonConvert 进行反序列化。

System.IO.TextReader textReader = System.IO.File.OpenText(path);
string all = textReader.ReadToEnd();
m_Elements = JsonConvert.DeserializeObject<MyType>(all);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多