aromanovich / jsl

A Python DSL for describing JSON schemas
http://jsl.readthedocs.org/
Other
218 stars 21 forks source link

howto generate scheme for json with large level of nesting #34

Closed mcgr0g closed 6 years ago

mcgr0g commented 6 years ago

Hello! For example, I have json example:

{
  "Company": {
    "Developer": {
      "Name": {
        "LegalFormCode": "LTD",
        "FullName": "Fly-by-night company. Mickey Mouse business",
        "ShortName": "Fly-by-night company",
        "comment": "comment",
      },
      "Address": {,
        "state": "California",
        "LocalityType": "city",
        "LocalityName": "Los Angeles",
        "StreetType": "Аvenue",
        "StreetName": "Mulholland",
        "ConstructionInfo": { "house": "1", "korpus": "2", "stroenie": "3" },
        "ApartmentInfo": { "flat": "4", "room": "5", "office": "6", "space": "7" },
        "comment": "comment",
      },
      "WorkTime": {
        "WorkDays": "Mo-Fr",
        "TimePeriod": "8-20",
      }
    }
  }
}

I know it's terrible :) But how should i use JSL to get such scheme? Document in Document in Document? Or I have to decare such classes as WorkDays and use it as "DocumentField" in WorkTime

mcgr0g commented 6 years ago

I've found answer. Here is valid code:

class DeveloperData(jsl.Document):
    class DeveloperName(jsl.Document):
        LegalFormCode = jsl.StringField(required=True, default="LTD")
        FullName = jsl.StringField(required=True, default="Fly-by-night company. Mickey Mouse business")
        ShortName = jsl.StringField(required=True, default="Fly-by-night company")
        comment = jsl.StringField(required=True, title="any comment")

    class DeveloperAddress(jsl.Document):
        state = jsl.StringField(required=True, default="California")
        LocalityType = jsl.StringField(required=True, default="city")
        LocalityName = jsl.StringField(required=True, default="Los Angeles")
        StreetType = jsl.StringField(required=True, default="Аvenue")
        StreetName = jsl.StringField(required=True, default="Mulholland")

    Name = jsl.DocumentField(DeveloperName, required=True)
    Address = jsl.DocumentField(DeveloperAddress, required=True)

class Company(jsl.Document):
    Developer = jsl.DocumentField(DeveloperData, required=True)

class integrationShema(jsl.Document):
    Company = jsl.DocumentField(Company, required=True)

json_to_file = integrationShema.get_schema(ordered=True)