gpt4 book ai didi

java - 如何在从 Jackson 中的字符串构造 JsonNode 时更改它的值

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:57 25 4
gpt4 key购买 nike

我有一个 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 方法时,不会调用 getCurrentValuegetValueAsString 方法,因此我无法在创建 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.* 能够区分 doublefloat

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com