使用lkJSON解析JSON

时间:2018-04-04 14:07:42

标签: json delphi delphi-7 instagram-api

我有一个JSON文件,我需要解析并提取一个值。

{
  "user": {
    "pk": 25025320,
    "username": "instagram",
    "full_name": "Instagram",
    "is_private": false,
    "profile_pic_url": "https://instagram.fmad3-5.fna.fbcdn.net/vp/295f9e76d3c26fdf613d7856e7b43348/5B4F495B/t51.2885-19/s150x150/14719833_310540259320655_1605122788543168512_a.jpg",
    "profile_pic_id": "1360316971354486387_25025320",
    "is_verified": true,
    "has_anonymous_profile_picture": false,
    "media_count": 5164,
    "follower_count": 233901016,
    "following_count": 187,
    "biography": "Discovering — and telling — stories from around the world.",
    "external_url": "",
    "usertags_count": 144,
    "hd_profile_pic_versions": [
      {
        "width": 320,
        "height": 320,
        "url": "https://instagram.fmad3-5.fna.fbcdn.net/vp/893534d61bdc5ea6911593d3ee0a1922/5B6363AB/t51.2885-19/s320x320/14719833_310540259320655_1605122788543168512_a.jpg"
      }
    ],
    "hd_profile_pic_url_info": {
      "url": "https://instagram.fmad3-5.fna.fbcdn.net/vp/8ae8a89c80ff4722eeab592b685276cb/5B5D40A1/t51.2885-19/14719833_310540259320655_1605122788543168512_a.jpg",
      "width": 320,
      "height": 320
    },
    "has_highlight_reels": true,
    "auto_expand_chaining": false
  },
  "status": "ok"
}

我想使用lkJSON库,Instagram API以及下面的代码提取并hd_profile_pic_url_info.url的{​​{1}}值,以实现this result

Memo2

3 个答案:

答案 0 :(得分:3)

您忘记了hd_profile_pic_url_info是另一个包含urlwidthheight的对象,因此您需要再次停下来。以下是如何正确完成此操作的示例。

var
  js : TlkJSONbase;
begin
  js := TlkJSON.ParseText(Memo1.Text);
  if Assigned(js) then
  begin
    js := js.Field['user'];
    if Assigned(js) then
    begin
      js := js.Field['hd_profile_pic_url_info'];
      if Assigned(js) then
      begin
        js := js.Field['url'];
        if Assigned(js) then
           Memo2.Lines.Add(VarToStr(js.Value));
      end;
    end;
  end;
end;

答案 1 :(得分:2)

我使用这个功能:

function ChildValueStr(AChild: TlkJSONbase; const Name: string; DefaultValue:
    AnsiString = ''): {$IF CompilerVersion>=26}WideString{$ELSE}AnsiString{$IFEND};
var
  tmpIndex: integer;
  tmpStr: {$IF CompilerVersion>=26}WideString{$ELSE}AnsiString{$IFEND};
begin
  Result:= DefaultValue;
  if IsNil(AChild) then exit;

  tmpStr:= (AChild as TlkJSONobject).{$IF CompilerVersion>=26}getWideString{$ELSE}getString{$IFEND}(Name);

  if tmpStr = '' then
  begin
    tmpIndex := (AChild as TlkJSONobject).IndexOfName(Name);
    if tmpIndex <> -1 then
      Result := (AChild as TlkJSONobject).getString(tmpIndex);
  end
  else Result:= tmpStr;
end;

所以使用你的代码,你可以使用它:

var sJSON: String;    
js, Items, Item: TlkJSONBase;    
I, J: Integer;    
begin    
    sJSON := Memo1.text;    
    js := TlkJSON.ParseText(sJSON);    
    for I := 0 to Pred(js.Count) do
    begin
        Items := js.Child[I].Field['user'];          
        Memo2.Lines.Add(ChildValueStr(Items, 'hd_profile_pic_url_info'));
    end;   
end;

我希望这可以帮助你

答案 2 :(得分:0)

另一种在不使用外部组件的情况下解析JSON的替代方法是免费在线服务https://jsontodelphi.com/

您粘贴JSON文本并生成一个带delphi类的单元来解析文本而不会出现问题。如果JSON文本很复杂,那就更好了。

在这种情况下,访问该值的代码最简单:

procedure TForm2.Button1Click(Sender: TObject);
var
  root:TRootClass;
begin
  root := TRootClass.FromJsonString(Memo1.Lines.Text {your JSON text});
  // The caption get the URL of the pic
  Caption := root.user.hd_profile_pic_url_info.url;
end;