- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 JSON 字符串,我想在使用 Jackson 库构建 JsonNode 时更改该值。例如:-
input: {"name":"xyz","price":"90.00"}
output:{"name":"xyz-3","price":90.90}
我创建了自己的 JsonFactory 并传递了自己的 Parser。但我只能更改键,不能更改与键关联的值。
代码:
private static ObjectMapper create() {
ObjectMapper objectMapper = new ObjectMapper(new JsonFactory() {
@Override
protected JsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) throws IOException {
return new MyParser(super._createParser(data, offset, len, ctxt));
}
@Override
protected JsonParser _createParser(InputStream in, IOContext ctxt) throws IOException {
return new MyParser(super._createParser(in, ctxt));
}
@Override
protected JsonParser _createParser(Reader r, IOContext ctxt) throws IOException {
return new MyParser(super._createParser(r, ctxt));
}
@Override
protected JsonParser _createParser(char[] data, int offset, int len, IOContext ctxt, boolean recyclable)
throws IOException {
return new MyParser(super._createParser(data, offset, len, ctxt, recyclable));
}
});
private static final class MyParser extends JsonParserDelegate {
private MyParser(JsonParser d) {
super(d);
}
@Override
public String getCurrentName() throws IOException, JsonParseException {
....
}
@Override
public String getText() throws IOException, JsonParseException {
...
}
@Override
public Object getCurrentValue() {
...
}
@Override
public String getValueAsString() throws IOException {
...
}
@Override
public String getValueAsString(String defaultValue) throws IOException {
...
}
}
下面是从字符串构造 JsonNode 的代码。
mapper.readTree(jsonStr);
在这种情况下,当调用 readTree 方法时,不会调用 getCurrentValue
或 getValueAsString
方法,因此我无法在创建 JsonNode 本身时更改值。json 字符串也可以不同。基本上我想从字符串构造一个 JsonNode 。所以绑定(bind)到一个特定的模式/bean 在这里不是一个好的选择。如何解决这个问题?时间差
为版本 2.7.4 添加更新代码:-
static class MyParser extends JsonParserDelegate {
MyParser(final JsonParser delegate) {
super(delegate);
}
@Override
public String getText() throws IOException {
final String text = super.getText();
if ("name".equals(getCurrentName())) {
return text + "-3";
}
return text;
}
@Override
public JsonToken nextToken() throws IOException {
if ("price".equals(getCurrentName())) {
// Advance token anyway
super.nextToken();
return JsonToken.VALUE_NUMBER_FLOAT;
}
return super.nextToken();
}
@Override
public int getCurrentTokenId() {
try {
if ("price".equals(getCurrentName())) {
return JsonTokenId.ID_NUMBER_FLOAT;
}
} catch (final IOException e) {
//
}
return super.getCurrentTokenId();
}
@Override
public NumberType getNumberType() throws IOException {
if ("price".equals(getCurrentName())) {
return NumberType.FLOAT;
}
return super.getNumberType();
}
@Override
public float getFloatValue() throws IOException {
return Float.parseFloat(getValueAsString("0")) + 0.09F;
}
@Override
public double getDoubleValue() throws IOException {
return Double.parseDouble(getValueAsString("0")) + 0.09D;
}
}
pom.xml:-
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.8.7</version>
<!--<scope>test</scope>-->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.8.7</version>
</dependency>
最佳答案
编辑:2.7.*
和 2.9.*
之间存在细微差别。
虽然 2.9.*
能够区分 double
和 float
getDoubleValue()
getFloatValue()
而不是 2.7.*
只使用
getDoubleValue()
即使是 ID_NUMBER_FLOAT
个代币。
因此,您需要决定是否要保持向后兼容性。
您也可以覆盖两者,就像我在这里所做的那样。
这就是您自定义 MyParser
static class MyParser extends JsonParserDelegate {
MyParser(final JsonParser delegate) {
super(delegate);
}
@Override
public String getText() throws IOException {
final String text = super.getText();
if ("name".equals(getCurrentName())) {
return text + "-3";
}
return text;
}
@Override
public JsonToken nextToken() throws IOException {
if ("price".equals(getCurrentName())) {
// Advance token anyway
super.nextToken();
return JsonToken.VALUE_NUMBER_FLOAT;
}
return super.nextToken();
}
@Override
public int getCurrentTokenId() {
try {
if ("price".equals(getCurrentName())) {
return JsonTokenId.ID_NUMBER_FLOAT;
}
} catch (final IOException e) {
//
}
return super.getCurrentTokenId();
}
@Override
public NumberType getNumberType() throws IOException {
if ("price".equals(getCurrentName())) {
return NumberType.FLOAT;
}
return super.getNumberType();
}
@Override
public float getFloatValue() throws IOException {
return Float.parseFloat(getValueAsString("0")) + 0.09F;
}
@Override
public double getDoubleValue() throws IOException {
return Double.parseDouble(getValueAsString("0")) + 0.09D;
}
}
输出:{"name":"xyz-3","price":90.09}
您的代码看起来不错,并且已经过测试并且可以正常工作;)
关于java - 如何在从 Jackson 中的字符串构造 JsonNode 时更改它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55454475/
我正在使用 jackson 库。我有很多 java 对象,它们只不过是 jsonNode 的包装器。因此想要将这些 jsonNodes 列表转换为单个 jsonNode。我怎样才能做到这一点。我试过这
我有主 JsonNode,{{k1:v1} = s1,{k2:v2} = s2,{k3:v3} = s3} 我单独获取一个节点键 {k1 : v1} 并将其分配给另一个变量并将其更新为 {k1 : n
我正在用 Java 编写 Play 2.3.2 应用程序。 在我的应用程序中,我调用了用 Scala 编写的其他模块的方法。 此方法返回一个 Json 响应,我尝试使用 WS 获取该响应。 这是我的方
我在写这篇文章时需要一些指导,以便我理解这个概念: 基本上,我需要在 String 和 JsonNode 之间进行转换,并且我已经看到了一个说明要做什么的答案,但作为新手开发人员,我不确定这意味着什么
我有以下 Json { "Parent": { "pk1": "pv1", "pk2": "pv2", "Child": {
我是 Java 菜鸟,正在努力进行类型转换。我有一个如下所示的 JSON 对象: [ { "A":{ "B":{
我遇到了转换错误,但不知道如何解决。 //get my json file as Map Map cm = null; try { cm = mapper.readValu
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 我需要获取此 arrayNode
我刚刚从 sourceforge.net 安装了 libjson。我尝试执行一个简单的程序但是我得到了这个错误 ‘JSONNode’ was not declared in this scope 这是
我在 Java 中使用 Jackson 库生成了以下 Json: { "name": "name1", "version": "0.0.1", "storage": {
我有以下 JSON 文件。 { "data": { "k1": "v1", "k2": "v2", ... } } 有什么方法可以将这些键和值作为 Map 获取吗?使用
通过 Play WS API,我得到了一个 Response 对象。因为它包含我调用的 JSON response.asJson() 这工作得很好。现在我想以 pretty-print 版本返回这个
我有这个json: { "text":[ {"a":1}, {"b":2} ] } 我有这个代码: JsonNode jsonNode = (new O
我正在尝试更新 expiryDate将嵌套的 JsonObject 中的变量设置为当前日期,JSON 的结构如下: { "expiryDate" : { "type" : "S
如何将 JsonNode 作为 java.email 中的电子邮件附件作为 json 文件发送 // Json node bit JsonNode requestBody = request().
考虑以下 Java 类定义。 CrudOperation.java: package com.cyberfront.test.json.nll.demonstration; import com.fa
我有一个类: Class myClass { @JsonProperty("status") boolean status; public boolean getStatus(
我正在从 cassandra 表中读取数据记录。创建我构建的 Java 对象。使用我从数据记录中获得的值设置所有值(我使用 jackson 从记录中获取这些值)。当我查看 json 请求时,我看到一个
我有一个Jackson子类型 ObjectNode 的 JsonNode: ObjectNode node = parent.path('somepath'); node 有许多子字段,例如您在这个
我有以下代码,它从 JsonNode 返回 string 的 list: public static List asList(final JsonNode jsonNode) {
我是一名优秀的程序员,十分优秀!