Fix up the recursive descent

This commit is contained in:
2025-03-25 11:57:46 +01:00
parent 533a563dc5
commit 88887b9a12
2 changed files with 30 additions and 8 deletions

View File

@@ -2,6 +2,7 @@ package jsonpath
import ( import (
"fmt" "fmt"
"log"
"strconv" "strconv"
) )
@@ -119,7 +120,10 @@ func evalStep(node interface{}, step JSONStep) []interface{} {
return evalWildcard(node) return evalWildcard(node)
case IndexStep: case IndexStep:
return evalIndex(node, step.Index) return evalIndex(node, step.Index)
case RootStep:
return []interface{}{node}
default: default:
log.Println("Unknown step type:", step.Type)
return nil return nil
} }
} }
@@ -141,12 +145,15 @@ func evalRecursiveDescent(node interface{}, targetKey string) []interface{} {
current := queue[0] current := queue[0]
queue = queue[1:] queue = queue[1:]
if m, ok := current.(map[string]interface{}); ok { if targetKey == "*" {
// Check if current level has target key results = append(results, current)
} else if m, ok := current.(map[string]interface{}); ok {
if val, exists := m[targetKey]; exists { if val, exists := m[targetKey]; exists {
results = append(results, val) results = append(results, val)
} }
// Add all children to queue }
if m, ok := current.(map[string]interface{}); ok {
for _, v := range m { for _, v := range m {
queue = append(queue, v) queue = append(queue, v)
} }

View File

@@ -5,7 +5,7 @@ import (
"testing" "testing"
) )
var testData = map[string]interface{}{ var testData = map[string]interface{}{
"store": map[string]interface{}{ "store": map[string]interface{}{
"book": []interface{}{ "book": []interface{}{
map[string]interface{}{ map[string]interface{}{
@@ -173,9 +173,24 @@ func TestEvaluator(t *testing.T) {
return return
} }
if !reflect.DeepEqual(result, tt.expected) { if len(result) != len(tt.expected) {
t.Errorf("EvaluateJSONPath() = %v, want %v", result, tt.expected) t.Errorf("Expected %d items, got %d", len(tt.expected), len(result))
} }
expectedSet := make(map[interface{}]bool, len(tt.expected))
for _, expected := range tt.expected {
expectedSet[expected] = true
}
for _, resultItem := range result {
if !expectedSet[resultItem] {
t.Errorf("Expected %v, got %v", tt.expected, resultItem)
}
}
// if !reflect.DeepEqual(result, tt.expected) {
// t.Errorf("EvaluateJSONPath() = %v, want %v", result, tt.expected)
// }
}) })
} }
} }