Skip to content

Latest commit

 

History

History
266 lines (183 loc) · 7.76 KB

JSON_Fact_pl.md

File metadata and controls

266 lines (183 loc) · 7.76 KB

JSON Fact

JSON_Fact_cn JSON_Fact_de JSON_Fact_en JSON_Fact_id JSON_Fact_pl

About | Tutorial | Rule Engine | GRL | GRL JSON | RETE Algorithm | Functions | FAQ | Benchmark


Używanie danych JSON do reprezentowania faktów w Grule jest dostępne od wersji 1.8.0. Umożliwia ono użytkownikowi wyrażanie faktów w formacie JSON, a następnie dodawanie tych faktów do DataContext, tak jak to się normalnie robi w kodzie. Wczytane fakty JSON są teraz "widoczne" dla skryptów Grule (GRL).

Dodawanie JSON jako faktu

Zakładając, że masz JSON w następującej postaci:

{
  "name" : "John Doe",
  "age" : 24,
  "gender" : "M",
  "height" : 74.8,
  "married" : false,
  "address" : {
    "street" : "9886 2nd St.",
    "city" : "Carpentersville",
    "state" : "Illinois",
    "postal" : 60110
  },
  "friends" : [ "Roth", "Jane", "Jake" ]
}

Umieszczasz swój plik JSON w tablicy bajtów.

myJSON := []byte (...your JSON here...)

Wystarczy dodać zmienną JSON do DataContext.

// create new instance of DataContext
dataContext := ast.NewDataContext()

// add your JSON Fact into data context using AddJSON() function.
err := dataContext.AddJSON("MyJSON", myJSON)

Tak, możesz dodać tyle faktów ile chcesz do kontekstu i możesz mieszać fakty JSON (używając AddJSON) z normalnymi faktami Go (używając Add)

Ocenianie (odczytywanie) wartości faktów JSON w GRL

W skrypcie GRL, fakty są zawsze widoczne poprzez ich etykiety, które podajesz podczas dodawania do DataContext. Na przykład, poniższy kod dodaje twój JSON i będzie on używał etykiety MyJSON.

err := dataContext.AddJSON("MyJSON", myJSON)

Tak, możesz użyć dowolnej etykiety, pod warunkiem że jest to pojedyncze słowo.

Przemieszczanie się po zmiennych członkowskich jak po normalnym obiekcie

Używając JSON pokazanego na początku, zakres GRL when może obliczyć twój json w następujący sposób.

when
   MyJSON.name == "John Doe"

lub

when
    MyJSON.address.city.StrContains("ville")

lub

when
    MyJSON.age > 30 && MyJSON.height < 60

Przemierzanie zmiennych członkowskich jak mapa

Możesz uzyskać dostęp do pól obiektu JSON używając Map jak selektora lub jak normalnego obiektu.

when
   MyJSON["name"] == "John Doe"

lub

when
    MyJSON["address"].city.StrContains("ville")

lub

when
    MyJSON.age > 30 && MyJSON["HEIGHT".ToLower()] < 60

Przemierzanie zmiennej członkowskiej tablicy

Element tablicy JSON można przeglądać tak samo jak zwykłą tablicę

when
   MyJSON.friends[3] == "Jake"

Zapisywanie wartości do faktów JSON w GRL

Tak, możesz zapisywać nowe wartości do faktów JSON w zakresie then swoich reguł. Te zmienione wartości będą wtedy dostępne w następnym cyklu oceny reguł. ALE, są pewne zastrzeżenia (przeczytaj "Rzeczy, które powinieneś wiedzieć" poniżej).

Zapisywanie zmiennej członkowskiej jak normalnego obiektu

Używając JSON pokazanego na początku, twój GRL then może zmodyfikować twój json fact w następujący sposób.

then
   MyJSON.name = "Robert Woo";

lub

then
    MyJSON.address.city = "Corruscant";

lub

then
    MyJSON.age = 30;

To dość proste. Ale są też pewne utrudnienia.

  1. Możesz modyfikować nie tylko wartość zmiennej członkowskiej obiektu JSON, możesz również zmienić jej typ. Zakładając, że twoja reguła jest w stanie obsłużyć kolejny łańcuch ewaluacji dla nowego typu, możesz to zrobić, w przeciwnym razie bardzo mocno odradzamy to.

    Przykład:

    Zmodyfikowałeś MyJSON.age na string.

     then
         MyJSON.age = "Thirty";
    

    Ta zmiana sprawi, że silnik będzie wpadał w panikę podczas sprawdzania reguł typu:

     when
         myJSON.age > 25
    
  2. Można przypisać wartość do nieistniejącej zmiennej członkowskiej.

    Przykład:

     then
         MyJSON.category = "FAT";
    

    Gdzie element category nie istnieje w oryginalnym JSON.

Zapisywanie zmiennej członkowskiej jak normalnej mapy

Używając JSON-a pokazanego na początku, twój GRL then może zmodyfikować twój json fact w następujący sposób.

then
   MyJSON["name"] = "Robert Woo";

lub

then
    MyJSON["address"]["city"] = "Corruscant";

lub

then
    MyJSON["age"] = 30;

Podobnie jak w przypadku stylu obiektu, obowiązują te same zwroty.

  1. Możesz modyfikować nie tylko wartość zmiennej członkowskiej swojej mapy JSON, możesz również zmienić jej typ. Zakładając, że Twoja reguła jest w stanie obsłużyć kolejny łańcuch ewaluacji dla nowego typu, możesz to zrobić, w przeciwnym razie bardzo mocno odradzamy to.

    Przykład:

    Zmodyfikowałeś MyJSON.age na string.

     then
         MyJSON["age"] = "Thirty";
    

    Ta zmiana sprawi, że silnik będzie wpadał w panikę podczas sprawdzania reguł typu:

     when
         myJSON.age > 25
    
  2. Można przypisać wartość do nieistniejącej zmiennej członkowskiej

    Przykład:

     then
         MyJSON["category"] = "FAT";
    

    Gdy element category nie istnieje w oryginalnym JSON.

Zapisywanie tablicy członków

Element tablicy można zastąpić, używając jego indeksu.

then
   MyJSON.friends[3] == "Jake";

Podany indeks musi być poprawny. Grule wpadnie w panikę, jeśli indeks będzie poza granicami. Podobnie jak w przypadku zwykłego JSON, można zastąpić wartość dowolnego elementu innym typem. Zawsze można też sprawdzić długość tablicy.

when
   MyJSON.friends.Length() > 4;

Można również dołączać do tablicy za pomocą funkcji Append. Append może również dołączać zmienną listę wartości argumentów do tablicy, używając różnych typów. (W przypadku zmiany typu danej wartości obowiązują te same zastrzeżenia).

then
   MyJSON.friends.Append("Rubby", "Anderson", "Smith", 12.3);

Znany problem

Nie ma wbudowanych funkcji ułatwiających użytkownikowi sprawdzanie zawartości tablicy, takich jak Contains(value) bool.

Rzeczy, które powinieneś wiedzieć

  1. Po dodaniu faktu JSON do DataContext, zmiana w łańcuchu JSON nie będzie odzwierciedlać faktów już znajdujących się w DataContext. Jest to również stosowane w odwrotnym kierunku, gdzie zmiany w faktach w DataContext nie zmienią łańcucha JSON.
  2. Możesz modyfikować swój fakt JSON w zakresie then, ale w przeciwieństwie do normalnych faktów Go, te zmiany nie będą miały odzwierciedlenia w oryginalnym łańcuchu JSON. Jeśli chcesz, aby tak się stało, powinieneś sparsować swój JSON do struct przedtem, i dodać struct do DataContext normalnie.