DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: aa123123123
今日帖子: 2
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 10:21:25
标题:
哎,解析json弄得我头大。。。 浏览:577
加入我的收藏
楼主: 要解析的Json字符串是这样的:
[{"产品名称":"汤剂","剂量":15,"剂量单位":"天","是否代煎":"是","处方信息":"[{\"药品名称\":\"白花蛇舌草\",\"剂量\":1,\"剂量单位\":\"g\",\"是否代煎\":\"无\"}]"},{"产品名称":"中药材","剂量":12,"剂量单位":"天","是否代煎":"是","处方信息":"[{\"药品名称\":\"大黄\",\"剂量\":1,\"剂量单位\":\"g\",\"是否代煎\":\"无\"},{\"药品名称\":\"生地黄\",\"剂量\":1,\"剂量单位\":\"g\",\"是否代煎\":\"无\"}]"},{"产品名称":"净白面膜","剂量":10,"剂量单位":"盒","是否代煎":"否"}]

代码如下:
if not 新的订单信息.货物信息.IsEmpty then
    begin
      JA:=TJSONObject.ParseJSONValue(新的订单信息.货物信息) as TJSONArray;
      lv1.Items.Clear;
      for I := 0 to JA.Count-1 do
      begin
        Json:= TJSONObject.ParseJSONValue(Trim(JA.Items[I].ToString)) as TJSONObject;
        with lv1.Items.Add do
        begin
          产品名称:=StringReplace(Json.Values['产品名称'].ToString,'"','',[rfReplaceAll]);
          Caption:=产品名称;
          SubItems.Add(Json.Values['剂量'].ToString);
          SubItems.Add(StringReplace(Json.Values['剂量单位'].ToString,'"','',[rfReplaceAll]));
          SubItems.Add(StringReplace(Json.Values['是否代煎'].ToString,'"','',[rfReplaceAll]));

          if Json.TryGetValue('处方信息',JsonValue) then
          begin
          Data:=TStringGrid.Create(nil);
          TStringGrid(Data).Parent:=grp6;
          TStringGrid(Data).Align:=alClient;
          TStringGrid(Data).Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goEditing];
          TStringGrid(Data).Font.Size:=10;
          TStringGrid(Data).ColCount:=4;
          TStringGrid(Data).FixedCols:=0;
          TStringGrid(Data).Visible:=True;
          TStringGrid(Data).OnDrawCell:=Mystrngrd1DrawCell;
          TStringGrid(Data).OnKeyDown:=Mystrngrd1KeyDown;
          TStringGrid(Data).OnKeyPress:=Mystrngrd1KeyPress;
          TStringGrid(Data).OnMouseDown:=Mystrngrd1MouseDown;
          TStringGrid(Data).OnSelectCell:=Mystrngrd1SelectCell;
          TStringGrid(Data).OnSetEditText:=Mystrngrd1SetEditText;
          lst1.Parent:=TStringGrid(Data);
          TStringGrid(Data).Cells[0,0]:='药品名称';
          TStringGrid(Data).ColWidths[0]:=225;
          TStringGrid(Data).Cells[1,0]:='剂量';
          TStringGrid(Data).ColWidths[1]:=100;
          TStringGrid(Data).Cells[2,0]:='剂量单位';
          TStringGrid(Data).ColWidths[2]:=120;
          TStringGrid(Data).Cells[3,0]:='煎药方式';
          TStringGrid(Data).ColWidths[3]:=120;

          tmp:=StringReplace(JsonValue.ToString,'\','',[rfReplaceAll]);
          //下一句代码失败
          tmpJA:=TJSONObject.ParseJSONValue(tmp) as TJSONArray;
          for J := 0 to tmpJA.Count-1 do
          begin
          tmpJson:= TJSONObject.ParseJSONValue(Trim(tmpJA.Items[J].ToString)) as TJSONObject;
          TStringGrid(Data).Cells[0,J]:=StringReplace(Json.Values['药品名称'].ToString,'"','',[rfReplaceAll]);
          TStringGrid(Data).Cells[1,J]:=StringReplace(Json.Values['剂量'].ToString,'"','',[rfReplaceAll]);
          TStringGrid(Data).Cells[2,J]:=StringReplace(Json.Values['剂量单位'].ToString,'"','',[rfReplaceAll]);
          TStringGrid(Data).Cells[3,J]:=StringReplace(Json.Values['煎药方式'].ToString,'"','',[rfReplaceAll]);
          end;
          end;
        end;
      end;
    end;
头疼头疼,希望大家指点一下,谢谢,另外想找个师傅,我周围只有我自己搞编程,连个讨论的人都没有,就算有也是弄web的,跟他们没有共同语言啊,我不会什么都问,只是希望有问题的话,能指点个方向就行,一个人自学太累了。
----------------------------------------------
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/29 10:29:26
1楼: 之前的帖子已经回过了,你这个
"处方信息":"[{\"药品名称\":\"白花蛇舌草\",\"剂量\":1,\"剂量单位\":\"g\",\"是否代煎\":\"无\"}]"
明显就有问题。
看你的意思就是想当成普通json来处理。那你用引号包裹以后就成字符串了,不但存储麻烦,而且转换也麻烦。
明显的脱裤子打屁按此在新窗口浏览图片
----------------------------------------------
--
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 10:41:13
2楼: 请教楼上应该怎么办?请高人指点
----------------------------------------------
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/3/29 10:46:53
3楼: 一楼给出的 json 没问题的,看 QDAC 的解析结果。。。
工欲善其事必先利其器
此帖子包含附件:
PNG 图像
大小:15.7K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。
又不靠它 delphi 吃饭,怕甚?
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/3/29 10:52:10
4楼: 楼主给出的 json 解析结果,连斜杠都帮你自动去掉哦
此帖子包含附件:
PNG 图像
大小:52.8K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。
又不靠它 delphi 吃饭,怕甚?
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/29 10:55:56
3楼: 一个json有什么花样么?楼上根本不懂我说的意思,也估计没彻底搞明白json


楼主看看下面的代码吧。delphi好久不写了。不知道对不对。反正差不多就这个意思。
const
  JSON_VALUE = '[' +
    '{"产品名称":"汤剂","剂量":15,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"白花蛇舌草","剂量":1,"剂量单位":"g","是否代煎":"无"}]},' +
    '{"产品名称":"中药材","剂量":12,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"大黄","剂量":1,"剂量单位":"g","是否代煎":"无"},' +
    '{"药品名称":"生地黄","剂量":1,"剂量单位":"g","是否代煎":"无"}]},{"产品名称":"净白面膜","剂量":10,"剂量单位":"盒","是否代煎":"否"}' +
    ']';
var
  pValue: TJSONValue;
  pArray: TJSONArray;
begin
  pValue := TJSONObject.ParseJSONValue(JSON_VALUE);
  if (nil = pValue) then
    Exit;

  pArray := pValue as TJSONArray;
  ...

  pValue.DisposeOf();
end;
----------------------------------------------
--
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 11:04:43
5楼: 我就是不知道怎么把处方信息里的数据取出来保存到stringgrid上去。。。我把处方信息中的字符串放到数组中时失败了,问题是这个语句和上一层的数组赋值语句是一样的,不明白为什么会失败。
----------------------------------------------
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 11:10:31
6楼: 净白面膜那里的反斜杠真的丢失了。。。我研究下
----------------------------------------------
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 11:12:21
7楼: 我在第二次赋值时已经统一去掉反斜杠了,应该没问题呀,真郁闷
tmp:=StringReplace(JsonValue.ToString,'\','',[rfReplaceAll]);
tmpJA:=TJSONObject.ParseJSONValue(tmp) as TJSONArray;
----------------------------------------------
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 11:15:09
8楼: 我试了一下,在第一次循环时,不论带不带反斜杠,赋值都会失败。。。
----------------------------------------------
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/29 11:19:13
7楼: 哎,都说了不要反斜杠。你带了双引号以后就成字符串了。
来回转换很好玩么?

以你的字符串为例:
[{"产品名称":"汤剂","剂量":15,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"白花蛇舌草","剂量":1,"剂量单位":"g","是否代煎":"无"}]},{"产品名称":"中药材","剂量":12,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"大黄","剂量":1,"剂量单位":"g","是否代煎":"无"},{"药品名称":"生地黄","剂量":1,"剂量单位":"g","是否代煎":"无"}]},{"产品名称":"净白面膜","剂量":10,"剂量单位":"盒","是否代煎":"否"}]

procedure TForm1.Button1Click(Sender: TObject);
const
  JSON_VALUE = '[' +
    '{"产品名称":"汤剂","剂量":15,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"白花蛇舌草","剂量":1,"剂量单位":"g","是否代煎":"无"}]},' +
    '{"产品名称":"中药材","剂量":12,"剂量单位":"天","是否代煎":"是","处方信息":[{"药品名称":"大黄","剂量":1,"剂量单位":"g","是否代煎":"无"},' +
    '{"药品名称":"生地黄","剂量":1,"剂量单位":"g","是否代煎":"无"}]},{"产品名称":"净白面膜","剂量":10,"剂量单位":"盒","是否代煎":"否"}' +
    ']';
var
  pValue: TJSONValue;
  pArray, pSubItem: TJSONArray;
  i, j: Integer;
  szName: String;
begin
  pValue := TJSONObject.ParseJSONValue(JSON_VALUE);
  if (nil = pValue) then
    Exit;

  pArray := pValue as TJSONArray;
  for i := 0 to pArray.Count - 1 do
  begin
    if not pArray.Items[i].TryGetValue<TJSONArray>('处方信息', pSubItem) then
      Continue;

    for j := 0 to pSubItem.Count - 1 do
    begin
      if not pSubItem.Items[j].TryGetValue<String>('药品名称', szName) then
        Continue;

      ShowMessage(szName);
    end;
  end;

  pValue.DisposeOf();
end;
----------------------------------------------
--
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/3/29 11:30:57
9楼: 反正我不懂,但我偏要解析反斜杠的 JSON 也根本无需去掉反斜杠,估计楼上的不懂。。。
此帖子包含附件:
PNG 图像
大小:27.5K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。
又不靠它 delphi 吃饭,怕甚?
作者:
男 xlonger (xlonger) ▲▲▲▲▲ -
普通会员
2019/3/29 11:39:25
10楼: 看 JSON的语法标准和 万一的博客。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 14:26:14
11楼: 找到原因了,处方信息后面的中括号前后都多了个双引号,难道这样会不兼容?我去掉前后的两个双引号就行了,郁闷!但是这样的代码太难看了
----------------------------------------------
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/3/29 15:40:48
12楼: 呵,不想解释了,你们爱咋咋滴吧。
----------------------------------------------
--
作者:
男 jackalan (nVicen) ★☆☆☆☆ -
盒子活跃会员
2019/3/29 15:54:38
13楼: 哎,楼上的已经和你解释老半天了,你多了引号,变成字符串了。
----------------------------------------------
简单做人,认真做事。
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2019/3/29 16:05:00
14楼: 嗯嗯,多谢各位指点,我再学习学习bahamut8348的代码,比我写的好多了,水平高就是不一样啊
----------------------------------------------
作者:
女 hecongzhen (令狐**) ▲▲▲▲▲ -
普通会员
2019/4/9 8:26:26
15楼: 用 superobject 解析 json 爽的很。。。。我的qq:602190388 我也是搞delphi 没事可以交流一下。。。。
----------------------------------------------
-
作者:
男 crystalmoon (黑夜杀手) ★☆☆☆☆ -
盒子活跃会员
2019/4/9 9:11:49
16楼: 其实就是这个意思。。。。带\就是识别为string了。。。如果无法改变json格式(没有话语权),你也可以提取这个String后二次解析。
此帖子包含附件:
PNG 图像
大小:74.1K
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行78.125毫秒 RSS