2014-11-21 51 views
0
procedure TMainForm.btn1Click(Sender: TObject); 
var 
    lHTTP: TIdHTTP; 
begin 
    lHTTP := TIdHTTP.Create(nil); 
    try 
    mmo1.Text := lHTTP.Get('http://guessit.io/guess?filename=House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv'); 
    finally 
    lHTTP.Free; 
    end; 
end; 

结果会是这样的:德尔福如何从HTTP解析指定的值获得

{ 
    "series":"House of Cards", 
    "episodeNumber":3, 
    "releaseGroup":"NTb", 
    "format":"WEBRip", 
    "season":2, 
    "audioCodec":"DolbyDigital", 
    "year":2013, 
    "mimetype":"video/x-matroska", 
    "container":"mkv", 
    "videoCodec":"h264", 
    "other":[ 
     "Netflix" 
    ], 
    "audioChannels":"5.1", 
    "screenSize":"1080p", 
    "type":"episode" 
} 

我怎么可以阅读系列(“系列”:“纸牌屋”)的值例。

我尝试使用

Function ExtractBetweenTags(Const Line, TagI, TagF: string): string; 
var 
    i, f : integer; 
begin 
    i := Pos(TagI, Line); 
    f := Pos(TagF, Copy(Line, i+length(TagI), MAXINT)); 
    if (i > 0) and (f > 0) then 
    Result:= Copy(Line, i+length(TagI), f-1); 
end; 

mmo1.Text := StringReplace(ExtractBetweenTags(mmo1.Text,'"series": "','"'), ' ', '-',[rfReplaceAll, rfIgnoreCase]);

,但我需要分析所有的值自动

+0

你正在使用哪个Delphi版本?您以JSON格式获取信息,而较新的版本具有JSON解析功能。对于更老的你可以使用一些现有的第三方库。 – 2014-11-21 09:53:46

+0

@DalijaPrasnikar德尔福XE7,我不知道这个输出是否叫JSON或不。 '{“系列”:“卡片屋”,“片段编号”:3,“releaseGroup”:“NTb”,“格式”:“WEBR​​ip”,“season”:2,“audioCodec”:“DolbyDigital” “:2013,”mimetype“:”video/x-matroska“,”container“:”mkv“,”videoCodec“:”h264“,”other“:[”Netflix“],”audioChannels“:”5.1“, “screenSize”:“1080p”,“type”:“episode”}' – RepeatUntil 2014-11-21 10:14:31

+0

如果是JSON,友好的服务器会在HTTP响应中指明它为内容类型头。您可以使用Firebug等浏览器插件查看HTTP标头。 (它对我来说看起来像JSON) – mjn 2014-11-21 10:48:13

回答

1

你可以使用包含在德尔福DBXJSON自2010年德尔福的另一种选择可能是使用例如超对象。
既然你显示的例子是一个没有嵌套的简单的JSON字符串,你可能只是通过对TJSONObject的访问来作为TJSONArray来访问这些值。
这个数组由成对的“名称”和值组成。
与您提供的字符串显示一个简单的例子:

uses 
DBXJSON; 

procedure TForm7.Button1Click(Sender: TObject); 
var 
    S:String; 
    I:Integer; 
    JObj:TJSONObject; 
    Pair : TJSONPair; 
begin 
    s := '{"series": "House of Cards", "episodeNumber": 3, "releaseGroup": "NTb", "format": "WEBRip", "season": 2' 
     +', "audioCodec": "DolbyDigital", "year": 2013, "mimetype": "video/x-matroska", "container": "mkv", "videoCodec": "h264", "other": ["Netflix"], "audioChannels": 

"5.1", "screenSize": "1080p", "type": "episode"}'; 
    JObj := TJSONObject.ParseJSONValue(s) as TJSONObject; 
    for I := 0 to TJSONArray(JObj).Size - 1 do 
    begin 
     Pair := TJSONPair(TJSONArray(JObj).Get(i)); 
     Memo1.Lines.Add(Pair.JsonString.Value + '=' + Pair.JsonValue.ToString) 
    end; 
end; 
1

你可以用类解析对象是这样的:

uses System.JSON, Rest.JSON; 

type 
    TGuess = class(TObject) 
    public 
    fseries: string; 
    fepisodeNumber: integer; 
    freleaseGroup: string; 
    fformat: string; 
    fseason: integer; 
    faudioCodec: string; 
    fyear: integer; 
    fmimetype: string; 
    fcontainer: string; 
    fvideoCodec: string; 
    fother: TArray<string>; 
    faudioChannels: string; 
    fscreenSize: string; 
    ftype: string; 
    end; 

var 
    g: TGuess; 
    s: string; // your input string 

    // g object will be created by following call and will contain parsed values 
    g := TJson.JsonToObject<TGuess>(s); 

    // do something with g 

    // release g after it is no longer needed 
    g.Free; 
0

感谢所有的答案,但在这里我终于弄明白

procedure TMainForm.btn1Click(Sender: TObject); 
var 
    S : String; 
    NS , S1,S2,series,season,episodeNumber : String; 
    L , I , LN : integer; 
    MM :TStringList; 
begin 
    try 
    MM := TStringList.Create; 
    NS := ''; 
    S := '{"series": "House of Cards", "episodeNumber": 3, "releaseGroup": "NTb", "format":'+ 
    '"WEBRip", "season": 2, "audioCodec": "DolbyDigital", "year": 2013, "mimetype": "video/x-matroska", "container": "mkv",'+ 
    '"videoCodec": "h264", "other": ["Netflix"], "audioChannels": "5.1", "screenSize": "1080p", "type": "episode"}'; 
    {if AnsiPos('title',s) <> 0 then 
    IsMovie := True 
    else 
    IsMovie := False;} 

    L := Length(S); 

    for I := 1 to L do 
     Begin 
      If (Ord(S[I]) <> 34) 
      And (Ord(S[I]) <> 123) 
      And (Ord(S[I]) <> 125) 
      Then NS := NS + Copy(S,I,1); 
     End; 
     S := NS; 
     NS := ''; 
     L := Length(S); 

    for I := 1 to L do 
     Begin 
      If (Ord(S[I]) = 44) 
      Or (Ord(S[I]) = 58) 
      Then Begin 
       NS := NS + #13#10; 
       MM.Add(Trim(NS)); 
       NS := ''; 
      End 
      Else NS := NS + Copy(S,I,1); 
     End; 
     MM.Add(Trim(NS)); 
//  -------------------------------------------------------------- 

     LN := MM.Count-1; 
     for I := 0 to LN Do 
     Begin 
      If MM[I] = Trim('series') 
      Then series := Trim(MM[I + 1]); 
      If MM[I] = Trim('season') 
      Then season := Trim(MM[I + 1]); 
      If MM[I] = Trim('episodeNumber') 
      Then episodeNumber := Trim(MM[I + 1]); 
     End; 

     ShowMessage(series+'.S'+season+'.E'+episodeNumber); 

    finally 
    MM.Free 
    end; 
end;