【问题标题】:Parsing with Json.NET: "Unexpected token: StartObject"使用 Json.NET 解析:“意外令牌:StartObject”
【发布时间】:2012-09-11 19:19:28
【问题描述】:

我正在解析 JSON 并收到以下错误:

我正在使用 Newtonsoft.Json.NET dll。

读取字符串时出错。意外标记:StartObject。路径“[0]”,第 1 行,位置 2。

这是我的代码:

public static List<string> GetPluginByCategory(string category)
    {
        var wc = new WebClient();
        var json = wc.DownloadString("http://api.bukget.org/api2/bukkit/category/" + category);
        var list = JsonConvert.DeserializeObject<List<string>>(json);
        return list;
    }

category 可以是以下字符串之一:

[“管理工具”、“反悲伤工具”、“聊天相关”、“开发者工具”、“经济”、“修复”、“乐趣”、“常规”、“信息”、“机制”、 “杂项”、“角色扮演”、“传送”、“网站管理”、“世界编辑与管理”、“世界生成器”]

编辑:这是我得到的回复:

 [{"description": "Stop users swearing\n", "name": "a5h73y", "plugname": "NoSwear"}, {"description": "Be sure that your server rules are read and accepted!", "name": "acceptdarules", "plugname": "AcceptDaRules"}]

有人知道为什么它不起作用吗?它以前可以工作:/。

【问题讨论】:

  • 请发布从服务器收到的准确的 JSON 数据。无论出于何种原因,它都可能不是“字符串数组”。
  • (实际上,看到响应很长,发布一个 short 但应该是响应的有效版本,显示相同的错误。错误是JSON.NET 正在寻找一个{,它需要一个字符串开始。List 映射到["a", "b", "etc"],而数据是[{someobj1}, {someobj2}, {etc}]。)
  • 这是我得到的一小段代码: [{"description": "Stop users swearing\n", "name": "a5h73y", "plugname": "NoSwear"}, {" description": "确保你的服务器规则被阅读和接受!", "name": "acceptdarules", "plugname": "AcceptDaRules"}
  • 更新主帖中的内容(不要忘记在末尾添加 ] 以使其具有代表性)。
  • 当它“曾经工作”时,来自服务器的数据是否相同?也许它改变了?

标签: c# json json.net


【解决方案1】:

您的 json 是一个复杂对象数组,而不是字符串数组。试试这个(测试):

WebClient wc = new WebClient();
string json = wc.DownloadString("http://api.bukget.org/api2/bukkit/category/Teleportation");

var items = JsonConvert.DeserializeObject<List<MyItem>>(json);

public class MyItem
{
    public string description;
    public string name;
    public string plugname;
}

编辑

WebClient wc = new WebClient();
var json = wc.DownloadString("http://api.bukget.org/api2/bukkit/plugin/aboot");

dynamic dynObj = JsonConvert.DeserializeObject(json);
Console.WriteLine("{0} {1}", dynObj.plugname,dynObj.link);
foreach (var version in dynObj.versions)
{
    var dt = new DateTime(1970, 1, 1).AddSeconds((int)version.date);
    Console.WriteLine("\t{0} {1} {2}",version.version, version.download, dt);
}

【讨论】:

  • 帖子里的“曾经工作”让我很反感;有没有办法让 Json.NET 将复杂值“填充”到字符串中(作为 JSON)?也许是转换器?
  • @pst 您可以使用List&lt;object&gt; 类型对列表中的每个项目进行反序列化和调用 ToString()。这将返回类似{ "description": null, "name": "abitofrealism", "plugname": "AbitOfRealism" }
  • 是的,我就是这么想的。无论如何,问题似乎是“API 更改”,所以不用再奇怪了。
  • 嗯...这可能是一个愚蠢的问题,但是我不能使用此代码从一个插件中检索数据。例如:http://api.bukget.org/api2/bukkit/plugin/aboot
  • @FoxyShadoww 你的 new url 返回一个完全不同的 json 字符串。您应该使用不同的类(或dynamic)来反序列化此响应。
猜你喜欢
  • 1970-01-01
  • 2017-10-13
  • 2022-01-02
  • 1970-01-01
  • 2018-08-14
  • 2012-05-17
  • 2019-02-19
  • 2017-11-21
  • 2013-09-26
相关资源
最近更新 更多