【问题标题】:Create an Array from Json Object从 Json 对象创建一个数组
【发布时间】:2021-12-24 21:55:49
【问题描述】:

我有以下 JSON 结构,从网络调用它:

[
  {
    "Code":"31212",
    "Desc":"JOHN",
    "DOYDESC":"MADRID",
    "Street":"Str41",
    "StreetNo":"86"
  },
  {
    "Code":"30214",
    "Desc":"GEORGE",
    "DOYDESC":"NEW YORK",
    "Street":"Str3",
    "StreetNo":null
  },
  {
    "Code":"09215",
    "Desc":"MARY",
    "DOYDESC":"PARIS",
    "Street":"Str3",
    "StreetNo":"22"
  },
  {
    "Code":"10217",
    "Desc":"MEGAN",
    "DOYDESC":"ROME",
    "Street":"Str4",
    "StreetNo":null
  }
]

我希望用户在Edit.Text 中给出一个数字,然后搜索Code 的值以查找给定值是否存在。

有没有办法使用 JSON 中的值创建一个名为 Code 的数组?

例如,要创建这样的东西:

Code = ["31212","30214","09215","10217"] 

然后进行搜索?或者,是否有另一种方法可以从 JSON 中找到 Code 的特定值?到目前为止我尝试过这个:

procedure Tlog_form.Button2Click(Sender: TObject);
var
  jso : TJsonObject;
  jsv,jsval : TJsonValue;
  jsa,jsarr : TJsonArray;
  data,str : string;
  i,j,user : integer;
  jsp : TJsonPair;
  arr : array of string;
begin
  try
    data := GetURLAsString('http://...');
  except
    on E: exception do
  end;

  try
    jsv := TJSONObject.ParseJSONValue(data);

    try
      jsa := jsv as TJSONArray;

      try
        for I := 0 to jsa.Size - 1 do
        begin
          jso := jsa.Get(i) as TJsonObject;
          if jso.ToString = 'Code' then
          begin
            str := jso.GetValue('Code').ToString;

            if Edit1.Text = str then
            begin
              ShowMessage('found it');
            end;

          end;
        end;
      finally
      end;
    finally
      jsv.Free;
    end;
  except
    on E: exception do
  end;
end;

当我调试时,它没有收到任何错误。但还是不行。

【问题讨论】:

    标签: arrays json delphi rad-studio


    【解决方案1】:

    您将数组中的每个TJSONObject 转换为string,然后将其与TEdit 文本进行比较。这显然不匹配。您只需比较每个TJSONObjectCode 字段,如果您完全删除if jso.ToString = 'Code' then 检查,您会这样做,例如:

    procedure Tlog_form.Button2Click(Sender: TObject);
    var
      jsv : TJSONValue;
      jsa : TJSONArray;
      jso : TJSONObject;
      data, str, code : string;
      I : integer;
    begin
      str := Edit1.Text;
      try
        data := GetURLAsString('http://...');
        jsv := TJSONObject.ParseJSONValue(data);
        if jsv <> nil then
        try
          jsa := jsv as TJSONArray;
          for I := 0 to jsa.Size - 1 do
          begin
            jso := jsa.Get(I) as TJSONObject;
            code := jso.GetValue('Code').ToString;
            if str = code then
            begin
              ShowMessage('found it');
            end;
          end;
        finally
          jsv.Free;
        end;
      except
      end;
    end;
    

    【讨论】:

      【解决方案2】:

      我不确定我是否非常了解你,但如果你尝试TALJsonDocument (https://github.com/Zeus64/alcinoe),你就有这个功能:

      Function ALFindJsonNodeByTextChildNodeValue(const JsonNode:TalJsonNode;
                                                  Const ChildNodeName: AnsiString;
                                                  Const ChildNodeValue : AnsiString;
                                                  Const Recurse: Boolean = False): TALJsonNode;
      

      【讨论】:

        猜你喜欢
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2014-03-29
        相关资源
        最近更新 更多