我有这个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字符串中添加'['']',否则我甚至无法得到第一个字段。
感谢!
答案 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的评论中所述:无需将[]
括起来,因为这会强制执行外部数组。