Delphi中的Json和System.JSON

时间:2015-10-28 18:15:00

标签: json delphi

我有这个Json

FormData

但是,我只能取第一项“Sucess,Msg和Ret”的值 我正在做如下

public async static Task<MultipartContent> GetMulipartContent(ApiController controller)
{
    if (!controller.Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);
    if (provider.FormData["someVar"] == null)
        doSomething()
}

sHtmlResp包含字符串json。

我已经尝试了其他一些方法来获得最不成功的字段,如何将子项目作为“Ret”,“Items”等等。

一个细节,不得不在我得到的JSON字符串中添加'['']',否则我甚至无法得到第一个字段。

感谢!

3 个答案:

答案 0 :(得分:5)

Ret是一个子对象,因此您需要这样访问它。它有自己的值和一系列子对象,依此类推。

试试这个:

var
 joName, joRet, joItem: TJSONObject;
 joItems: TJSONArray;
 sHtmlResp, sMsg: String;
 bSuccess: Boolean;
begin
  sHtmlResp := ...; // original JSON without added braces around it
  joName := TJSONObject.ParseJSONValue(sHtmlResp) as TJSONObject;

  bSuccess := joName.GetValue('Success') is TJSONTrue;
  // if you are using Delphi 10 Seattle or later, you can use this instead:
  // bSuccess := (joName.GetValue('Success') as TJSONBool).AsBoolean;

  sMsg := joName.GetValue('Msg').Value;

  joRet := joName.GetValue('Ret') as TJSONObject;
  // use joRet.GetValue() as needed ...

  joItems := joRet.GetValue('Itens') as TJSONArray;
  for i := 0 to joItems.Count-1 do
  begin
    joItem := joItems.Items[i] as TJSONObject;
    // use joItem.GetValue() as needed ...
  end;
end;

答案 1 :(得分:0)

如果每个对象/子对象都有唯一的ObjectID (名称)。

简单的方法是使用此功能

function ExtractJsonParm(parm:string;h:string):string;
var r:integer;
begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then
    result := copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-1)
  else
    result:='';
end;

<强>用法:

begin
  Writeln(ExtractJsonParm('First',Value));
  Writeln(ExtractJsonParm('Next',Value));
  Writeln(ExtractJsonParm('Total',Value));
end;

<强>输出:

0
true
60

答案 2 :(得分:0)

使用jsonDoc将是

JSON(sHtmlResp)['Msg']

可选地包含在VarToStr中以强制执行类型(并且还将Null静默地转换为空字符串值)。

如Remy的评论中所述:无需将[]括起来,因为这会强制执行外部数组。