使用动态密钥创建JSON(Progress 4GL)

时间:2017-10-11 11:08:16

标签: json dataset openedge progress-4gl

我为2个临时表定义了一个数据集,该数据集与某个字段链接(比方说:item)。例如:

define temp-table items no-undo
  field item as char.

define temp-table customer no-undo
  field item     as char serialize-hidden
  field custname as char
  field price    as dec.

define dataset dsitemcust for items,customer
  data-relation dr1 for items,customer relation-fields(item,item) nested.

这给出了json输出:

{
  "items": [
     {
        "item": "abc_item",
        "customer": [
           {
              "custname": "uvw_cust",
              "price": 123
           },
           {
              "custname": "xyz_cust",
              "price": 234
           }, 
           ....
        ]
     },
     {
        "item": "def_item",
        "custname": [{},{},...]
     }
     ...
     ]
}

但我希望得到这样的东西: [ 项目为关键 custname和price < / strong>(在 custnum 再次成为关键字的对象数组中]]

{ "abc_item" : [{"uvw_cust" : 123}, {"xyz_cust" : 234}, ...],
  "def_item" : [{}, .. ],
  ..
}

这是否可行/可实现进行中的开放? (进展版本:10.2B)

1 个答案:

答案 0 :(得分:1)

可以这样做,但您必须手动构建JSON对象。

USING Progress.Json.ObjectModel.*.

DEFINE VARIABLE oJson AS JsonObject NO-UNDO.
DEFINE VARIABLE oArray AS JsonArray NO-UNDO.
DEFINE VARIABLE oRec AS JsonObject NO-UNDO.

DEFINE TEMP-TABLE items NO-UNDO
  FIELD item AS CHARACTER.

DEFINE TEMP-TABLE customer NO-UNDO 
  FIELD item     AS CHARACTER
  FIELD custname AS CHARACTER
  FIELD price    AS DECIMAL.

/* Create some records here. */

oJson = NEW JsonObject().

FOR EACH items NO-LOCK:

    oArray = NEW JsonArray().

    FOR EACH customer WHERE customer.item = items.item NO-LOCK BREAK BY customer.item:
        oRec = NEW JsonObject().
        oRec:ADD(customer.custname, customer.price).
        oArray:ADD(oRec).
    END.

    oJson:ADD(items.item, oArray).
END.

oJson:WriteFile("test.json", TRUE).

这会将oJson对象写入文件,但您可以将其用作输出。