Search code examples
jsonorientdb

JSON field array insertion in OrientDB


I am trying to persist following JSON,



    {
    "kind": "plus#person",
    "etag": "\"Sh4sdfsdfdfWv7jTXojqc/WnNi6ckHr4lXu1JzlY3Rz_GYpM8\"",
    "emails": [
    {
    "value": "joe@ymail.com",
    "type": "account"
    }
    ],
    "objectType": "person",
    "id": "10209236048995686597",
    "displayName": "joe garry",
    "name": {
    "familyName": "Joe",
    "givenName": "Garry"
    },
    "isPlusUser": false,
    "language": "en",
    "verified": false,
    "domain": "gmail.com"
    }

Schema creation is as follows,



    OClass profile = schema.createClass("profile").setSuperClass(vClass);
    ProfileEnum[] profProps = ProfileEnum.values();
    for (int i = 0; i < profProps.length; i++) {
        profile.createProperty(profProps[i].name, profProps[i].otype);
    }

    OClass mail = schema.createClass("profileMails").setSuperClass(vClass);
    ProfileEnum.EMails[] emailProps = ProfileEnum.EMails.values();
    for (int i = 0; i < emailProps.length; i++) {
        mail.createProperty(emailProps[i].name, emailProps[i].otype);
    }
    profile.createProperty("emails", OType.EMBEDDEDLIST, mail);

    OClass name = schema.createClass("GOAuthPeopleName").setSuperClass(vClass);
    ProfileEnum.Name[] nameProps = ProfileEnum.Name.values();
    for (int i = 0; i < nameProps.length; i++) {
        name.createProperty(nameProps[i].name, nameProps[i].otype);
    }
    profile.createProperty("name", OType.EMBEDDED, name);

Insert JSON implementation,



    try (ODatabaseDocumentTx db = documentService().getTx()) {
        ODocument doc = new ODocument("profile").fromJSON(indvidual.getProfileJSON());
        doc.save();
    }

Above insertion is throwing following Error,

The field 'profile.emails' has been declared as EMBEDDEDLIST but an incompatible type is used. Value: {value=joe@ymail.com, type=account}

What is wrong with this code? Insertion work if emails files is not present in JSON.


Solution

  • After adding @type : “d” and @class in json I was able to insert,

    {
      "@type" : "d",
      "@class": "profileMails",
      "value": "joe@ymail.com",
      "type": "account"  
    }