Visual Basic Json.net Newtonsoft.Json.JsonReaderException错误

时间:2017-07-28 23:40:09

标签: json vb.net json.net instagram screen-scraping

所以我最近开始学习Visual Basic,并且正在测试解析HTML数据只是为了一点乐趣。当我进入一些JSON时,我下载了牛顿软包并开始学习它是如何工作的。我开始只是试图获取任何用户的Instagram页面的URL,但是出现了一个我似乎无法解决的错误,而且我是VB的新手,我认为最好是寻求一些帮助而不是让我不知所措。

以下是代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QPushButton;
class Hover;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void hover();

private:
    QPushButton* pb;
    Hover* h;
};

#endif // MAINWINDOW_H

所以我在这一行得到错误:

#include "mainwindow.h"
#include "hover.h"
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    pb = new QPushButton("Button", this);
    connect(pb, SIGNAL(clicked(bool)), this, SLOT(hover()));
}

MainWindow::~MainWindow() {}

void MainWindow::hover()
{
    QPropertyAnimation* a = new QPropertyAnimation(pb, "geometry");
    a->setDuration(1000);
    a->setStartValue(QRect(0, 0, pb->width(), pb->height()));
    a->setEndValue(QRect(50, 50, pb->width(), pb->height()));
    a->start();
    h = new Hover(pb);
    h->setGeometry(300, 300, 50, 100);
    h->show();
}

Saying:Newtonsoft.Json.JsonReaderException:'读完JSON内容后遇到的其他文本:;。路径'',第1行,第3220位。' 位置编号总是在变化。但我不确定为什么会这样。

任何帮助我都很感激!

编辑: Json对于everybodies instagram帐户是不同的,但这里的例子是Fifa的Json: https://pastebin.com/J3U0uz4S

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

主要问题是你的JSON字符串在最后的右括号后面以分号字符(;)结尾,这是无效的JSON。 (参见JSON.org。)解析器显然没有预料到这一点,所以它抛出一个异常,告诉你在JSON结束后有内容的附加文本(分号)。因此,您需要在反序列化之前去掉这个额外的字符。

json = json.TrimEnd(";")

修复后,第二个问题是您的模型与JSON不匹配。看起来您正在尝试反序列化user数据,但该数据嵌套在JSON中的几个级别。您需要类来表示这些外层。您不一定需要在每个级别添加每个属性 - 只是您感兴趣的属性 - 但是您确实需要从根目录到目标对象的所有级别,以便正确地反序列化它

顺便说一句,Visual Studio具有可以从JSON示例为您生成类的功能。只需将您的JSON复制到剪贴板,然后从Paste JSON As Classes菜单中选择Edit -> Paste Special即可。注意这个工具不是万无一失的;生成的类有时需要一些手动更正。特别是,该工具不正确地生成数组属性。但是,当您使用复杂的JSON结构时,它可以为您提供一个很好的开端。

以下是从您的JSON反序列化基本user数据所需的最小类结构。 (请注意,我省略了media属性;如果要获取该数据,则需要定义更多类。)

Public Class Rootobject
    Public Property entry_data As Entry_Data
End Class

Public Class Entry_Data
    Public Property ProfilePage As List(Of Profilepage) 
End Class

Public Class Profilepage
    Public Property user As User
End Class

Public Class User
    Public Property biography As String
    Public Property blocked_by_viewer As Boolean
    Public Property country_block As Boolean
    Public Property external_url As String
    Public Property external_url_linkshimmed As String
    Public Property followed_by As Followed_By
    Public Property followed_by_viewer As Boolean
    Public Property follows As Follows
    Public Property follows_viewer As Boolean
    Public Property full_name As String
    Public Property has_blocked_viewer As Boolean
    Public Property has_requested_viewer As Boolean
    Public Property id As String
    Public Property is_private As Boolean
    Public Property is_verified As Boolean
    Public Property profile_pic_url As String
    Public Property profile_pic_url_hd As String
    Public Property requested_by_viewer As Boolean
    Public Property username As String
    Public Property connected_fb_page As Object
End Class

Public Class Followed_By
    Public Property count As Integer
End Class

Public Class Follows
    Public Property count As Integer
End Class

完成后,您可以反序列化并获取个人资料图片,如下所示:

' Deserialize into the Rootobject class
Dim root As Rootobject = JsonConvert.DeserializeObject(Of Rootobject)(json)

' Drill down to get the profile pic
Dim picture As String = root.entry_data.ProfilePage(0).user.profile_pic_url_hd

小提琴:https://dotnetfiddle.net/dNLXDx