来自virustotal api的Json解析结果

Posted

技术标签:

【中文标题】来自virustotal api的Json解析结果【英文标题】:Json parse result from virustotal api 【发布时间】:2011-06-02 16:53:47 【问题描述】:

我今天正在玩 virustotal api,同时以这种形式返回结果

 "permalink" : "http://www.virustotal.com/file-scan/report.html?id=7b6b268cbca9d421aabba5f08533d3dcaba50e0f7887b07ef2bd66bf218b35ff-1304089592",
  "report" : [ "2011-04-29 15:06:32",
       "AVG" : "Exploit_c.TVH",
        "AhnLab-V3" : "PDF/Exploit",
        "AntiVir" : "EXP/Pidief.UK",
        "Antiy-AVL" : "***/win32.agent",
        "Avast" : "JS:Pdfka-gen",
        "Avast5" : "JS:Pdfka-gen",
        "BitDefender" : "Exploit.PDF-JS.Gen",
        "CAT-QuickHeal" : "",
        "ClamAV" : "",
        "Comodo" : "Exploit.JS.Pidief.~AWQ",
        "DrWeb" : "",
        "Emsisoft" : "Exploit.JS.Pdfka!IK",
        "F-Prot" : "",
        "F-Secure" : "Exploit:W32/Pidief.DEE",
        "Fortinet" : "",
        "GData" : "",
        "Ikarus" : "Exploit.JS.Pdfka",
        "Jiangmin" : "",
        "K7AntiVirus" : "",
        "Kaspersky" : "Exploit.JS.Pdfka.dnc",
        "McAfee" : "",
        "McAfee-GW-Edition" : "",
        "Microsoft" : "Exploit:Win32/Pdfjsc.NJ",
        "NOD32" : "PDF/Exploit.Pidief.PGD",
        "Norman" : "",
        "PCTools" : "***.Pidief",
        "Panda" : "",
        "Prevx" : "",
        "Rising" : "",
        "SUPERAntiSpyware" : "",
        "Sophos" : "Troj/PDFJs-RD",
        "Symantec" : "***.Pidief",
        "TheHacker" : "",
        "TrendMicro" : "TROJ_PIDIEF.VTG",
        "TrendMicro-HouseCall" : "TROJ_PIDIEF.VTG",
        "VBA32" : "",
        "VIPRE" : "Exploit.PDF-JS.Gen (v)",
        "ViRobot" : "PDF.S.Exploit.74634",
        "VirusBuster" : "",
        "eSafe" : "",
        "eTrust-Vet" : ""
      
    ],
  "result" : 1

我想知道如何解析这个结果来填写一份备忘录,例如:

Memo1.Lines.Add(Format('Antivirus: %0s Result: %1s', [...]));

好吧,我真的不知道所有可能存在的 JSon 组件,也许有人可以在这里指导我正确的方向?

最诚挚的问候,

H.迈泽

【问题讨论】:

你用的是哪个版本的delphi? 这不需要 JSON 或其他任何东西。这是非常简单的文本解析,可以通过调用Pos 来提取相关文本([] 之间的部分),使用CommaTextStrictDelimitersTStringList,以及非常简单的循环来分隔每行的两半(AV 名称和输出)。为什么要为这么简单的工作添加外部库的复杂性? 好吧,例如,虽然我得到的结果(Json)将来可能会改变,所以它可能是可变的?至少学习如何用 json 解析它没有错? 【参考方案1】:

解析Json字符串并不难,可以使用delphi 2010以来包含的DBXJSON单元。

检查此示例代码

Uses
  DBXJSON;

procedure TForm1.ParseString(const AString: string);
var
  json          : TJSONObject;
  jPair         : TJSONPair;
  jValue        : TJSONValue;
  jcValue       : TJSONValue;
  l,i           : Integer;
begin
    json    := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(AString),0) as TJSONObject;
  try
    //get the pair to evaluate in this case the index is 1
    jPair   := json.Get(1);
    //cast the JsonValue to TJSONArray to access the elements of the array
    jValue := TJSONArray(jPair.JsonValue).Get(1);
    l:=TJSONArray(jValue).Size;
    for i:=0 to l-1 do
    begin
     //get the i element of the array 
     jcValue := TJSONArray(jValue).Get(i);
     //get the pair pointing to the i element 
     jPair   := TJSONPair(jcValue);
     //show the result 
     Memo1.Lines.Add(Format('Antivirus %s Result %s',[jPair.JsonString.Value,jPair.JsonValue.Value]));
    end;
  finally
     json.Free;
  end;
end;

作为额外的建议,您必须阅读 Json 教程以了解如何解释 Json 格式,并且您必须准备好使用任何可用的库。

【讨论】:

我同意你阅读关于 json 的内容。我已经测试了你的程序,但它给了我访问冲突? 我用您发布的相同字符串测试了代码。你在哪一行有问题? 在调用 ParseString 时直接引发访问冲突? ParseString(Memo2.Text);繁荣 在此行引发的访问冲突的奇怪结果相同:jValue := TJSONArray(jPair.JsonValue).Get(1); @HMeiser,D2010 中的 JSON 解析器不符合 JSON 规范。它至少违反了两个条款:insignificant whitespace、exponential notation。不要使用它。【参考方案2】:

我推荐开源 JSON 库 SuperObject 和在线 JSON 检查器,例如 http://jsonviewer.stack.hu/ 或 http://json.parser.online.fr/(这个编辑器有一个非常有用的选项,可以将类型信息添加到视图中)

【讨论】:

这两个 javascript 应用程序一点用处都没有。 JSON 是专门为人性化设计的。

以上是关于来自virustotal api的Json解析结果的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?

在 Ruby 中解析来自 Eventbrite API 的 JSON 响应

以角度解析来自 API 的 JSON 字符串

我如何解析来自 openlibrary api 的 Json 数据? (适当地)

以(Json 格式)解析来自 Google Place api 响应的数据

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?