ObjectNode我有一个接受as 的控制器@RequestBody。
这ObjectNode代表json一些用户数据
{
"given_name":"ana",
"family_name": "fabry",
"email": "fabry@gmail.com",
"password": "mypass",
"gender": "FEMALE"
}
Run Code Online (Sandbox Code Playgroud)
控制器.java
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public JsonNode createUser(@RequestBody ObjectNode user){
return userService.addUser(user);
}
Run Code Online (Sandbox Code Playgroud)
我想让用户将ObjectNode其转换为 JavaPOJO将其保存到数据库并再次将其返回为JsonNode.
UserServiceImpl.java
private final UserRepository userRepository;
private final UserMapper userMapper;
@Override
public JsonNode addUser(@RequestBody ObjectNode user) {
try {
return userMapper.fromJson(user)
.map(r -> {
final User created = userRepository.save(r);
return created;
})
.map(userMapper::toJson)
.orElseThrow(() -> new ResourceNotFoundException("Unable to find user")); …Run Code Online (Sandbox Code Playgroud) 我在 Java 应用程序中使用Jackson JSON 库及其树模型系统 ( JsonNode)。在此,我需要检查一个是否ArrayNode包含给定的JsonNode. 我一直在寻找通过JavaDoc中,我没有看到任何形式的.contains()对方法ArrayNode。我最终自己编写了一个包含方法:
public static boolean arrayNodeContains(ArrayNode arrayNode, JsonNode node) {
Stream<JsonNode> nodeStream = StreamSupport.stream(arrayNode.spliterator(), false);
return nodeStream.anyMatch(j -> j.equals(node));
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
@Test
public void testArrayNodeContains()
throws IOException
{
ObjectMapper mapper = new ObjectMapper;
String arrayJsonString = "[{\"foo\":\"bar\"},{\"foo\":\"baz\"},{\"baz\":\"bar\"}]";
String nodeTrueJsonString = "{\"foo\":\"bar\"}";
String nodeFalseJsonString = "{\"foo\":\"brains\"}";
List<Object> list = mapper.readValue(arrayJsonString, List.class);
ArrayNode arrayNode = mapper.valueToTree(list);
Map<String, Object> nodeTrueMap = mapper.readValue(nodeTrueJsonString, Map.class);
JsonNode nodeTrue …Run Code Online (Sandbox Code Playgroud) 我有一个比较两个对象的方法,但是我不知道如何通过Jackson库比较JsonNode。
我想要得到这样的东西:
private boolean test(JsonNode source) {
JsonNode test = compiler.process(file);
return test.equals(source);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置代码来创建一个节点树Jackson,然后可以使用它来编写JSON或XML. 我已经像这样手动创建了节点树:
XmlMapper nodeMapper = new XmlMapper();
ObjectNode rootNode = nodeMapper.createObjectNode();
ObjectNode currentNode = rootNode.putObject("Examples");
currentNode.put("Puppy", TRUE)
.put("Apple", 2)
.put("Jet", "Li");
currentNode = rootNode.putObject("Single");
currentNode.put("One", 1);
String writePath = "C:/users/itsameamario/Documents/basicXMLtest.xml";
nodeMapper.writeValue(new File(writePath), rootNode);
Run Code Online (Sandbox Code Playgroud)
我的 XML 输出是:
<?xml version="1.0"?>
<ObjectNode>
<Examples>
<Puppy>true</Puppy>
<Apple>2</Apple>
<Jet>Li</Jet>
</Examples>
<Single>
<One>1</One>
</Single>
</ObjectNode>
Run Code Online (Sandbox Code Playgroud)
但是,对于 XML 的某些部分,我想向其中一个节点添加一个属性,如下所示:
<Examples overlyComplicated="yes">
<!--...-->
</Examples>
Run Code Online (Sandbox Code Playgroud)
我发现的所有包含属性的示例都应用于预先存在的类。我一直无法找到一种将属性添加到手动构建的节点树的方法,如上所述。使用它可行Jackson吗?
使用这些方法时我有点困惑。如果两种方法都返回相同的值,那么为什么 Jackson API 提供了两种不同的方法?
我试图将一个空节点设置为其他 json 节点的值。new JsonNode()不起作用,因为它受到保护。
例子:
JsonNode jsonNode = externalSource(); // <--This is the parent json node
((ObjectNode) jsonNode).set("fieldName", new JsonNode()); // <-- I want to replace the existing
// value of fieldName with an empty one
Run Code Online (Sandbox Code Playgroud)
目前这不起作用。
我们有什么特别的方法可以做到这一点吗?
我有这个字符串,我使用 ObjectMapper 将其覆盖到 jsonNode。然后我尝试在这个 jsonNode 中查找特定的键,所以我使用了“.has”,但它不起作用!!\n这是我所做的:
\n{ \n "links": {\n "data": {\n "self": {\n "body": "", \n "content_type": "",\n "href": "/api/v2/nodes",\n "method": "POST", \n "name": "" \n } \n }\n },\n "results": { \n "data": {\n "properties": { \n "container": true,\n "container_size": 0,\n "create_date": "2020-06-22T16:19:07",\n "create_user_id": 1000,\n "description": ""\n "description_multilingual": { \n "en": "",\n "fr_FR": "" \n },\n "external_create_date": null,\n "external_identity": "",\n "external_identity_type": "",\n "external_modify_date": null,\n "external_source": "",\n "favorite": false,\n "id": 276625,\n "mime_type": null,\n "modify_date": "2020-06-22T16:19:07",\n "modify_user_id": 1000,\n "name": …Run Code Online (Sandbox Code Playgroud) 我正在尝试保存一个具有 JsonNode 属性的实体,并且必须将其转换为 jsonb 才能存储在 postgres 数据库中。
这是数据库表:
CREATE TABLE IF NOT EXISTS configuration_data (
id SERIAL NOT NULL PRIMARY KEY,
namespace_name TEXT NOT NULL,
dimension_id TEXT NOT NULL,
dimension_value TEXT,
path TEXT,
data JSONB,
version BIGINT DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)
这是实体:
@MappedEntity(value = "configuration_data")
data class ConfigurationDataEntity(
@field:Id @GeneratedValue
val id: Long,
@MappedProperty("namespace_name")
val namespaceName: String,
@MappedProperty("dimension_id")
val dimensionId: String,
@MappedProperty("dimension_value")
val dimensionValue: String,
@MappedProperty("path")
val path: String,
@MappedProperty("data")
val data: JsonNode,
@MappedProperty("version")
val version: Long,
)
Run Code Online (Sandbox Code Playgroud)
我正在尝试将这样的实体保存到存储库中:
val entity …Run Code Online (Sandbox Code Playgroud) 我有 JSON:
{
"dimensions": [
{
"name": "dim1"
},
{
"name": "dim2"
},
{
"name": "dim3"
}
]
}
Run Code Online (Sandbox Code Playgroud)
加载到 JsonObject 中
JsonObject root = JsonNode.Parse(jsonString)?.AsObject();
Run Code Online (Sandbox Code Playgroud)
我希望使用 LINQ 迭代 JsonArray
var list = root["dimensions"].GetEnumerator().Select(p => p["name"].GetValue).ToArray();
Run Code Online (Sandbox Code Playgroud)
但出现错误
CS1061:“IEnumerator <JsonNode?>”不包含“Select”的定义,并且找不到接受“IEnumerator <JsonNode?>”类型的第一个参数的可访问扩展方法“Select”(您是否缺少 using 指令或装配参考?)
我在谷歌上搜索 JsonNode 和 LINQ 时几乎找不到什么。也许还不支持?