2017-10-12 2 views
1

Je n'arrive pas à enregistrer une requête JSON dans un document DynamicDocument dans MongoDB à l'aide de mongoengine.Echec de la sauvegarde d'une structure JSON complexe dans DynamicEmbeddedDocument (Mongoengine, Flask)

Voici mon document:

class documentSource(DynamicEmbeddedDocument): 
    name = StringField() 

class documentParent(Document): 
    name = StringField(max_length=120) 
    source = ListField(EmbeddedDocumentField('documentSource')) 

Ceci est ma demande objet POST:

{ 
     "name": "Test", 
     "source": [{ 
      "name": "my first source" 
      "metadata": { 
      "name": "testing", 
      "products": [ 
       {"name":"my product", "price":123} 
      ] 
      } 
     },{ 
      "name": "my second source" 
      "metadata": { 
      "name": "Test", 
      "profile": "foo" 
      } 
     } 
     ] 
    } 

Voici ma méthode post Flask:

def post(self): 
     myObj = documentParent(
      name=self.data['name'], 
      description=self.data['description'], 
     ) 

     sourceList = [] 
     for i in self.data['source']: 
      content = documentSource(**i) 
      sourceList.append(content) 
     myObj.source = sourceList 
     myObj.save() 

Mais le problème est:

Si je envoyer cette JSON ne fonctionne pas:

{ 
     "name": "Test", 
     "source": [{ 
      "name": "my first source" 
      "metadata": { 
      "name": "testing", 
      "products": [ 
       {"name":"my product", "price":123} 
      ] 
      } 
     },{ 
      "name": "my second source" 
      "metadata": { 
      "name": "Test", 
      "profile": "foo", 
      "foo" : { 
       "foo1": "var1" 
      } 
      } 
     } 
     ] 
    } 

Mais avec cet objet fonctionne:

{ 
     "name": "Test", 
     "source": [{ 
      "name": "my first source" 
      "metadata": { 
      "name": "testing", 
      "products": [ 
       "my product" 
      ] 
      } 
     },{ 
      "name": "my second source" 
      "metadata": { 
      "name": "Test", 
      "profile": "foo" 
      } 
     } 
     ] 
    } 

Le même problème avec la liste de la liste:

"image": 
    {"available_sizes": 
    [[[150, 
     19], 
     "assets/images/150x150.png"], 
    [[250, 
     31], 
     "assets/images/250x250.png"], 
    [[450, 
     57], 
     "assets/images/450x450.png"]] 

Je pense qu'avec JSON complexes » structures L'analyseur de mongoengine ne fonctionne pas. Je ne sais pas comment résoudre ce problème parce que je ne peux pas contrôler les informations source, la grande image est de prendre un objet JSON d'une source (par exemple: crawlers) et l'enregistrer (comme il vient) dans mon DynamicDocument.

Merci d'avance pour votre aide.

Répondre

0

Il vous manque des virgules après "ma première source" et "ma deuxième source". Votre JSON n'est pas valide.

valide:

{ 
"name": "Test", 
"source": [{ 
    "name": "my first source", 
    "metadata": { 
     "name": "testing", 
     "products": [{ 
      "name": "my product", 
      "price": 123 
     }] 
    } 
}, { 
    "name": "my second source", 
    "metadata": { 
     "name": "Test", 
     "profile": "foo", 
     "foo": { 
      "foo1": "var1" 
     } 
    } 
}] 

}

outil Nifty pour valider votre JSON:

https://jsonlint.com/

+0

Non désolé, ce fut une erreur de copier-coller à cette question, en fait, je l'utilise un facteur pour faire une demande, et un facteur a un validateur. –

+0

La réponse est correcte. Votre JSON est invalide. Acceptez-le et postez une question différente ... –