Ошибка преобразования json в запись с помощью метода constructFrom - PullRequest
1 голос
/ 21 апреля 2020

Я получаю ошибку ниже при попытке преобразовать json в запись с помощью метода constructFrom.

error {ballerina/lang.typedesc}ConversionError message='map<json>' value cannot be converted to 'news_impl:RolelessUser'

В чем проблема с моим подходом? Я разместил свой пример ниже (изменен для публикации).

import model;
import ballerina/io;
import ballerina/jsonutils;

type AuthDAO object {

    public function getUserInfo(string userEmail) returns (model:User) {
        // This is defined to compare the the errorneous result with this successful one
        RolelessUser x1 = {
            userId: "qqqwww",
            emailAddress: "sam@gmail.com",
            firstName: "sammm",
            lastName: "rrr",
            age: "33",
            nic: "1212121",
            dateAdded: "2020-04-19",
            publicKey: "ssddff"

        };

        RolelessUser|error rolelessUserRecord1 = RolelessUser.constructFrom(x1);
        io:println("rolelessUserRecord:", rolelessUserRecord1);

        model:User user = {};

        json[] userInfoJson = [];
        io:println("in DAO: email:", userEmail);
        var userInfoTable = testDB->select(GET_USER_INFO, RolelessUser, userEmail);
        io:println("userInfoTable:" + userInfoTable.toString());
        if (userInfoTable is table<model:RolelessUser>) {
            userInfoJson = <json[]>jsonutils:fromTable(userInfoTable);
            io:println("JSON is josn 1: ", userInfoJson[0]);
            io:println("Test JSON is josn 2: ", x1);

            io:println("Roleless User Info: ", userInfoJson[0]);

            // this works
            RolelessUser|error rolelessUserRecordTest = RolelessUser.constructFrom(x1);
            io:println("Test rolelessUser  Record:", rolelessUserRecordTest);

            // this FAILS
            RolelessUser|error rolelessUserRecord = RolelessUser.constructFrom(userInfoJson[0]);
            io:println("rolelessUser  Record:", rolelessUserRecord);

            model:Role[]|error rolesArray = [];
            var userRolesTable = testDB->select(GET_USER_ROLES, model:Role, userEmail);
            json[] rolesJsonArray = [];
            if (userRolesTable is table<model:Role>) {
                rolesJsonArray = <json[]>jsonutils:fromTable(userRolesTable);
                rolesArray = model:Role[].constructFrom(rolesJsonArray);
                if (rolesArray is model:Role[]) {
                    io:println("User Roles:", rolesArray);
                }
            }
            if (rolelessUserRecord is model:RolelessUser) {
                io:println("YYY");
                user.firstName = rolelessUserRecord.firstName;
                user.lastName = rolelessUserRecord.lastName;
                user.emailAddress = rolelessUserRecord.emailAddress;
                user.age = rolelessUserRecord.age;
                user.nic = rolelessUserRecord.nic;

                io:println("reolseArray:", rolesArray);

                if (rolesArray is model:Role[]) {
                    user.roles = rolesArray;
                }
            }

            return user;
        }
        return user;
    }
};

type RolelessUser record {
    string userId = "";   
    string emailAddress = "";
    string firstName = "";
    string lastName = "";
    string age = "";
    string nic = "";
    string dateAdded = "";
    string publicKey = "";
};


Дает вывод ниже с вышеупомянутой ошибкой при вызове метода getUserInfo ().

rolelessUserRecord:userId=qqqwww emailAddress=sam@gmail.com firstName=sammm lastName=rrr age=33 nic=1212121 dateAdded=2020-04-19 publicKey=ssddff
in DAO: email:sam@gmail.com
userInfoTable:
JSON is josn 1: userId=qqqwww emailAddress=sam@gmail.com firstName=sammm lastName=dddk age=23 nic=1212121 dateAdded=2020-04-19 publicKey=ssddff
Test JSON is josn 2: userId=qqqwww emailAddress=sam@gmail.com firstName=sammm lastName=rrr age=33 nic=1212121 dateAdded=2020-04-19 publicKey=ssddff
Roleless User Info: userId=qqqwww emailAddress=sam@gmail.com firstName=sammm lastName=dddk age=23 nic=1212121 dateAdded=2020-04-19 publicKey=ssddff
Test rolelessUser  Record:userId=qqqwww emailAddress=sam@gmail.com firstName=sammm lastName=rrr age=33 nic=1212121 dateAdded=2020-04-19 publicKey=ssddff
rolelessUser  Record:error {ballerina/lang.typedesc}ConversionError message='map<json>' value cannot be converted to 'news_impl:RolelessUser'
User Roles:role_name=writer role_name=reader
Got userr info:roles= userId= emailAddress= firstName= lastName= age= nic= dateAdded= publicKey=

1 Ответ

2 голосов
/ 21 апреля 2020

Обычно это происходит из-за несовместимости между ожидаемым типом поля и фактическим типом записи в объекте JSON или отсутствующими / дополнительными полями. Поскольку все поля, по-видимому, присутствуют в JSON, в данном случае это может быть первое.

Просто чтобы сузить проблему, вы можете получить доступ к отдельным полям из объекта JSON и проверить, тип для каждого отдельного поля - ожидаемый тип.

например,

json jsonObj = userInfoJson[0];
io:println(jsonObj.userId is string); // and so on

Вы также можете распечатать userInfoJson[0].toJsonString(), чтобы получить правильно отформатированный JSON, который также может помочь определить проблему .

Существует проблема , чтобы отследить улучшение ошибки при таких .constructFrom() сбоях.

...