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).
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
)
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.
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
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
Element tablicy JSON można przeglądać tak samo jak zwykłą tablicę
when
MyJSON.friends[3] == "Jake"
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).
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.
-
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
-
Można przypisać wartość do nieistniejącej zmiennej członkowskiej.
Przykład:
then MyJSON.category = "FAT";
Gdzie element
category
nie istnieje w oryginalnym JSON.
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.
-
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
-
Można przypisać wartość do nieistniejącej zmiennej członkowskiej
Przykład:
then MyJSON["category"] = "FAT";
Gdy element
category
nie istnieje w oryginalnym JSON.
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
.
- Po dodaniu faktu JSON do
DataContext
, zmiana w łańcuchu JSON nie będzie odzwierciedlać faktów już znajdujących się wDataContext
. Jest to również stosowane w odwrotnym kierunku, gdzie zmiany w faktach wDataContext
nie zmienią łańcucha JSON. - Możesz modyfikować swój fakt JSON w zakresie
then
, ale w przeciwieństwie do normalnych faktówGo
, 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 dostruct
przedtem, i dodaćstruct
doDataContext
normalnie.