В Dataweave 2 есть (простой) способ преобразования полей String в полезной нагрузке в Numbers (если числа) и Booleans (если логические значения) - PullRequest
2 голосов
/ 22 октября 2019

Мое самое большое препятствие в том, что я не знаю, как выглядит входная полезная нагрузка. Но мне нужно преобразовать любые числовые строки в числа, а "true" / "false" - в true / false.

Нужно ли рекурсивно обходить весь объект / массивы объектов, проверять и назначать каждое поле илиесть какой-нибудь ярлык для этого?

Конечно, если бы я знал структуру входной полезной нагрузки, это не было бы большим делом. К сожалению, это мои требования.

1 Ответ

3 голосов
/ 23 октября 2019

@ machaval правильно, вы должны пройти.

Есть способ, и в зависимости от вашего фона это может быть просто. Это должно быть хорошим началом, даже если оно немного негибко:

%dw 2.0
output application/dw

var ds = [
    {
        a: "1",
        b: "2",
        c: "str",
        d: ["1","2","str","false"],
        e: "true"
    },
    {
        a: "1",
        b: "2",
        c: "str",
        d: ["1","2","str","false"],
        e: "true"
    }
]

import try,orElseTry,orElse from dw::Runtime
// Overloaded functions that traverse the types that I know
// my data structure contains.  I only traverse arrays and objects
// and the combination thereof. If you expect more types in your
// data you will have to add one overloaded function per datatype
// you expect to have up and beyond what I show below.
fun traverse(a: Array) = a map traverse($)
fun traverse(o: Object) = o mapObject {($$): traverse($)}
fun traverse(s: String) = 
        try(() -> s as Number) 
        orElseTry(() -> s as Boolean)
        orElse(s)   

---
traverse(ds)

edit: включить логические значения

...