Java实现XML转JSON后Rest Assured通用属性解析函数求助
Hey there! As a fellow Rest Assured newbie, I totally get wanting to build reusable functions to avoid repeating parsing code. Let's walk through how to solve both your requirements step by step.
First, Let's Tweak Your Existing XML-to-JSON Conversion
First, let's clean up your current code a bit (using newer Jackson methods for JsonParser):
// Your updated XML-to-JSON code String messageBody = actualResult.get("StatusMessage"); JSONObject xmlConvertedJson = XML.toJSONObject(messageBody); JsonElement jsonElement = JsonParser.parseString(xmlConvertedJson.toString());
1. Reusable Function to Fetch Key-Value Pairs by Attribute Path
Rest Assured's JsonPath is perfect for this—it supports dot-separated paths like customerScore.scoreResult out of the box. Here's a generic function that works for any data type:
import io.restassured.path.json.JsonPath; import com.google.gson.JsonElement; public class JsonParsingHelper { // Generic method to get any type of value from JSON public static <T> T getAttributeValue(JsonElement jsonElement, String attributePath, Class<T> returnType) { JsonPath jsonPath = JsonPath.from(jsonElement.toString()); return jsonPath.getObject(attributePath, returnType); } // Convenience overload for string values (super common!) public static String getStringAttribute(JsonElement jsonElement, String attributePath) { return getAttributeValue(jsonElement, attributePath, String.class); } }
How to Use It
// Get the score result you mentioned String scoreResult = JsonParsingHelper.getStringAttribute(jsonElement, "customerScore.scoreResult"); System.out.println("customerScore.scoreResult = " + scoreResult); // Outputs ACCEPT if that's the value // If you need a number, e.g., a score value Integer scoreValue = JsonParsingHelper.getAttributeValue(jsonElement, "customerScore.scoreValue", Integer.class);
2. Parsing the primaryInvolvedParty Node
You have two solid options here—pick whichever fits your workflow better:
Option 1: Convert to a Map (Quick & Generic)
Great if you don't want to create a class for the node, or if the structure might change occasionally:
public static Map<String, Object> getPrimaryInvolvedPartyAsMap(JsonElement jsonElement) { JsonPath jsonPath = JsonPath.from(jsonElement.toString()); return jsonPath.getObject("primaryInvolvedParty", Map.class); }
Usage
Map<String, Object> partyDetails = JsonParsingHelper.getPrimaryInvolvedPartyAsMap(jsonElement); // Access fields directly String partyId = (String) partyDetails.get("partyId"); Integer partyAge = (Integer) partyDetails.get("age");
Option 2: Use a Custom POJO (Type-Safe & Clean)
Perfect if you'll be working with this node often—no type casting needed:
First, define a POJO that matches your primaryInvolvedParty structure:
public class PrimaryInvolvedParty { private String partyId; private String fullName; private Integer age; // Add all other fields present in your JSON node // Don't forget getters and setters! public String getPartyId() { return partyId; } public void setPartyId(String partyId) { this.partyId = partyId; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
Then add this parsing method to your helper class:
public static PrimaryInvolvedParty getPrimaryInvolvedPartyAsPojo(JsonElement jsonElement) { JsonPath jsonPath = JsonPath.from(jsonElement.toString()); return jsonPath.getObject("primaryInvolvedParty", PrimaryInvolvedParty.class); }
Usage
PrimaryInvolvedParty party = JsonParsingHelper.getPrimaryInvolvedPartyAsPojo(jsonElement); System.out.println("Party ID: " + party.getPartyId()); System.out.println("Full Name: " + party.getFullName());
Bonus Tip: Simplify XML-to-JSON with Rest Assured
You can skip manual XML-to-JSON conversion entirely by using Rest Assured's XmlPath—it can convert XML directly to a JSON-friendly structure:
import io.restassured.path.xml.XmlPath; // Alternative approach: Let Rest Assured handle XML conversion XmlPath xmlPath = XmlPath.from(messageBody); JsonElement jsonElement = xmlPath.getAsJsonObject(); // Adjust if your XML has a root node (e.g., xmlPath.getAsJsonObject("root"))
This keeps your code more aligned with Rest Assured's built-in tools!
内容的提问来源于stack exchange,提问作者Nithin

