【问题标题】:How to iterate through an Json array with same keys, but different values using Faster xml如何使用 Faster xml 遍历具有相同键但不同值的 Json 数组
【发布时间】:2020-01-28 18:12:20
【问题描述】:
  1. 我正在尝试解析具有相同键值的 json 数组,如下所示:
Back End Response:"Countries":[{"state":"Queens Land "state":"Tasmania"}].

2.我创建了类来读取后端响应并使用faster XML 映射值,但只有数组中的最后一个值被复制,而不是整个数组。这就是我创建Data Transfer Object 类的方式。

现在 Test 对象包含 Countries 数组,但只读取了 State 值之一。即

"Countries":["States":"Tasmania"].

请原谅我的错别字。有人可以帮忙吗,有人可以建议下面的代码有什么问题吗..

private Class Test{
  List<Countries> countries;
}

private class Countries{        
  private String States;
}

private class Mapper {

}

在我的 Mapper 类中使用更快的 XML 读取值

【问题讨论】:

  • 国家应该有一个private List&lt;String&gt; States 而不是
  • 这个问题有很多问题。首先,您的json 不是有效的,可能是:{ "Countries":[{"state":"Queens Land", "state":"Tasmania"}] }。此外,如果您希望 States 存储多个值,它应该是 @bradm6s 建议的列表。

标签: java json rest api fasterxml


【解决方案1】:

假设您的JSON 有效负载是:

{
  "Countries": [
    {
      "state": "Queens Land",
      "state": "Tasmania"
    }
  ]
}

根据RFC7159

对象结构表示为一对花括号 围绕零个或多个名称/值对(或成员)。一个名字是一个 细绳。每个名称后面都有一个冒号,用于分隔名称 从价值。单个逗号将值与以下值分开 姓名。 对象中的名称应该是唯一的

在您的示例中,您没有唯一的名称,并且大多数 JSON 解析器会跳过重复的值并且只取一个。因此,如果您可以更改后端响应,只需将其更改为:

{
  "Countries": [
    {
      "state": "Queens Land"
    },
    {
      "state": "Tasmania"
    }
  ]
}

{
  "Countries": [
    "Queens Land",
    "Tasmania"
  ]
}

但如果你不能这样做,你需要使用Streaming API 并实现你的自定义反序列化器。见下例:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Test test = mapper.readValue(jsonFile, Test.class);
        System.out.println(test);
    }
}

class CountriesJsonDeserializer extends JsonDeserializer<Countries> {

    @Override
    public Countries deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        List<String> states = new ArrayList<>();
        while (p.nextToken() != JsonToken.END_OBJECT) {
            if (p.currentToken() == JsonToken.FIELD_NAME) {
                if ("state".equalsIgnoreCase(p.getText())) {
                    p.nextToken();
                    states.add(p.getText());
                }
            }
        }

        Countries countries = new Countries();
        countries.setStates(states);
        return countries;
    }
}

class Test {

    @JsonProperty("Countries")
    private List<Countries> countries;

    public List<Countries> getCountries() {
        return countries;
    }

    public void setCountries(List<Countries> countries) {
        this.countries = countries;
    }

    @Override
    public String toString() {
        return "Test{" +
                "countries=" + countries +
                '}';
    }
}

@JsonDeserialize(using = CountriesJsonDeserializer.class)
class Countries {
    private List<String> states;

    public List<String> getStates() {
        return states;
    }

    public void setStates(List<String> states) {
        this.states = states;
    }

    @Override
    public String toString() {
        return "Countries{" +
                "states=" + states +
                '}';
    }
}

以上示例打印:

Test{countries=[Countries{states=[Queens Land, Tasmania]}]}

另见:

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2012-08-13
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多