You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Karate中遍历JSON对象数组并获取两个数组间的所有不匹配项?

JSON Object Array: Traversal & Mismatch Detection

Let’s break down solutions to your two core questions—traversing the array and finding mismatches between two such arrays—plus how to adapt this to your existing Scenario Outline workflow.

1. Traversing a JSON Object Array

The approach varies slightly by language, but here are straightforward examples for common tools:

JavaScript Example

const jsonArray = [
  { "Name":"Joseph", "City":"Chennai", "Address":"Anna street", "values":[ "NA" ] },
  { "Name":"Sathya", "City":"Chennai", "Address":"Mugan street", "values":[ "engineering" ] }
];

// Iterate with for...of (clean and readable)
for (const item of jsonArray) {
  console.log(`Name: ${item.Name}, City: ${item.City}`);
  console.log(`Values: ${item.values.join(', ')}`);
}

// Or use forEach for functional-style iteration
jsonArray.forEach(item => {
  // Process each object's fields here
});

Python Example

json_array = [
  {"Name":"Joseph", "City":"Chennai", "Address":"Anna street", "values":["NA"]},
  {"Name":"Sathya", "City":"Chennai", "Address":"Mugan street", "values":["engineering"]}
]

for item in json_array:
    print(f"Name: {item['Name']}, City: {item['City']}")
    print(f"Values: {', '.join(item['values'])}")

Java Example (using Jackson)

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;

public class JsonTraversal {
    public static void main(String[] args) throws Exception {
        String jsonStr = "[{\"Name\":\"Joseph\",\"City\":\"Chennai\",\"Address\":\"Anna street\",\"values\":[\"NA\"]},{\"Name\":\"Sathya\",\"City\":\"Chennai\",\"Address\":\"Mugan street\",\"values\":[\"engineering\"]}]";
        
        ObjectMapper mapper = new ObjectMapper();
        List<Map<String, Object>> jsonArray = mapper.readValue(jsonStr, List.class);
        
        for (Map<String, Object> item : jsonArray) {
            System.out.println("Name: " + item.get("Name") + ", City: " + item.get("City"));
            List<String> values = (List<String>) item.get("values");
            System.out.println("Values: " + String.join(", ", values));
        }
    }
}

2. Detecting Mismatches Between Two JSON Object Arrays

To find all discrepancies, you’ll need to align elements (by index or unique ID) and compare every field—including the nested values array.

Approach 1: Compare by Index (Assumes Same Order)

Use this if your arrays are guaranteed to have elements in the same sequence:

const array1 = [/* Your first array */];
const array2 = [/* Your second array */];
const mismatches = [];

array1.forEach((item1, index) => {
  const item2 = array2[index];
  if (!item2) {
    mismatches.push(`Array2 missing element at index ${index} (Name: ${item1.Name})`);
    return;
  }

  // Compare top-level fields
  Object.keys(item1).forEach(key => {
    if (key === 'values') {
      // Sort values to handle unordered arrays
      const vals1 = item1.values.sort();
      const vals2 = item2.values.sort();
      if (JSON.stringify(vals1) !== JSON.stringify(vals2)) {
        mismatches.push(`Mismatch in 'values' for ${item1.Name}: ${vals1.join(',')} vs ${vals2.join(',')}`);
      }
    } else if (item1[key] !== item2[key]) {
      mismatches.push(`Mismatch in '${key}' for ${item1.Name}: ${item1[key]} vs ${item2[key]}`);
    }
  });

  // Check for extra fields in array2's element
  Object.keys(item2).forEach(key => {
    if (!item1.hasOwnProperty(key)) {
      mismatches.push(`Extra field '${key}' in Array2 for ${item2.Name}: ${item2[key]}`);
    }
  });
});

// Check for extra elements in array2
array2.forEach((item2, index) => {
  if (!array1[index]) {
    mismatches.push(`Array1 missing element at index ${index} (Name: ${item2.Name})`);
  }
});

console.log("Mismatches found:", mismatches);

Approach 2: Compare by Unique ID (Order Doesn’t Matter)

If elements might be out of order, use a unique field like Name to match objects first:

def find_mismatches(array1, array2):
    mismatches = []
    # Create lookup maps for quick access
    map1 = {item['Name']: item for item in array1}
    map2 = {item['Name']: item for item in array2}

    # Check items in array1 not present in array2
    for name, item1 in map1.items():
        if name not in map2:
            mismatches.append(f"Item '{name}' exists in array1 but not array2")
            continue
        item2 = map2[name]
        
        # Compare each field
        for key in item1.keys():
            if key == 'values':
                if sorted(item1[key]) != sorted(item2[key]):
                    mismatches.append(f"Mismatch in 'values' for {name}: {item1[key]} vs {item2[key]}")
            elif item1[key] != item2[key]:
                mismatches.append(f"Mismatch in '{key}' for {name}: {item1[key]} vs {item2[key]}")
        
        # Check extra fields in array2's item
        for key in item2.keys():
            if key not in item1:
                mismatches.append(f"Extra field '{key}' in array2 for {name}: {item2[key]}")
    
    # Check items in array2 not present in array1
    for name in map2.keys():
        if name not in map1:
            mismatches.append(f"Item '{name}' exists in array2 but not array1")
    
    return mismatches

# Usage
array1 = [/* Your first array */]
array2 = [/* Your second array */]
print("Mismatches:", find_mismatches(array1, array2))

3. Adapting Scenario Outline (Cucumber) for JSON Arrays

Since you’re used to Scenario Outline for plain JSON objects, here’s how to extend it to arrays:

Option 1: Parameterize by Element Name

Test each element individually with a data table:

Scenario Outline: Validate JSON array element matches
  Given I have two JSON arrays
  When I compare the element named '<Name>' from both arrays
  Then all fields for '<Name>' should match

  Examples:
    | Name    |
    | Joseph  |
    | Sathya  |

In your step definition (Java example):

@When("I compare the element named '{string}' from both arrays")
public void compareElementByName(String name) {
    Map<String, Object> item1 = findItemByName(array1, name);
    Map<String, Object> item2 = findItemByName(array2, name);
    
    // Run field-by-field comparison and assert no mismatches
}

private Map<String, Object> findItemByName(List<Map<String, Object>> array, String name) {
    return array.stream()
                .filter(item -> name.equals(item.get("Name")))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("Item not found: " + name));
}

Option 2: Validate Entire Arrays in One Scenario

If you want to check all elements at once:

Scenario: Verify full JSON array match
  Given I have JSON array1: '<array1>'
  And I have JSON array2: '<array2>'
  When I compare the two arrays
  Then there should be no mismatches

In your step definition, parse the JSON strings into arrays, run the mismatch detection logic from earlier, and assert the mismatches list is empty.


内容的提问来源于stack exchange,提问作者Joseph Maduram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:38:14