package nl.fd.hamcrest.jackson;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import java.io.IOException;
import static org.hamcrest.CoreMatchers.allOf;
/**
* @author Frans Flippo
*/
public class IsJson extends TypeSafeDiagnosingMatcher<String> {
private final Matcher<? extends JsonNode> matcher;
public IsJson(Matcher<? extends JsonNode> matcher) {
this.matcher = matcher;
}
@Override
protected boolean matchesSafely(String item, Description mismatchDescription) {
try {
JsonNode jsonNode = new ObjectMapper().readTree(item);
if (matcher.matches(jsonNode)) {
return true;
} else {
matcher.describeMismatch(jsonNode, mismatchDescription);
return false;
}
} catch (IOException e) {
mismatchDescription.appendText("Invalid JSON");
return false;
}
}
@Override
public void describeTo(Description description) {
description.appendText("is JSON matching ").appendDescriptionOf(matcher);
}
@Factory
public static IsJson isJson(Matcher<? extends JsonNode> valueMatcher) {
return new IsJson(valueMatcher);
}
}