要素の配列の要素の配列と同様に配列したJSONデータを処理するためのPOJOを作成する方法

アミット・クマール:

我々は、我々が持っているシナリオ持つJSONフィールドの2つの異なる値を持つ複数可。私たちは、それを用いたすべてのjsonsを解析したいと思いますPOJO以下は、これらの2つの見つけることができJSONペイロードを。

{
  "values": [
    [
      {
        "name": "item_name",
        "value": "pool"
      }
    ],
    [
      {
        "name": "item_name",
        "value": "Mob"
      }
    ]
  ],
  "name": "lines"
}

そして:

{
  "values": [
    {
      "name": "pack",
      "value": "Enter, HD"
    }
  ],
  "name": "lines"
}

私は以下のようにPOJOを指定した場合、現在、第二JSONは例外をスローします

class ValuesModel extends Serializable {

  @BeanProperty
  var values: List[List[ValueModel]] = _

}

私は以下のようにPOJOを指定した場合、第一JSONは例外をスローします

class ValuesModel extends Serializable {

  @BeanProperty
  var values: List[ValueModel] = _

}

1を作成するには、そこの方法であるPOJOという例外をキャッチし、別のスキーマを使用して解析するよりも、一緒に両方jsonsを解析するには?私が使用していJackson解析します。

マイケルZiober:

このようなケースでは、複数の処理したい場所JSONのスキーマを同じにそれをデシリアライズすることができPOJO、カスタムデシリアライザを実装し、必要なすべてのシナリオを実装する必要がモデル。

以下は、例を見つけることができますJava両方のdeserialiseする方法JSONペイロードを:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.node.MissingNode;
import com.fasterxml.jackson.databind.type.SimpleType;
import com.fasterxml.jackson.databind.util.TokenBuffer;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class JsonApp {

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

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

class ValuesModelJsonDeserializer extends JsonDeserializer<List<ValueModel>> {

    @Override
    public List<ValueModel> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        final JsonDeserializer<Object> deserializer = ctxt.findRootValueDeserializer(SimpleType.constructUnsafe(ValueModel.class));
        final JsonNode root = p.readValueAsTree();
        // If node is a JSON object
        if (root.isObject()) {
            return Collections.singletonList(deserialize(p.getCodec(), root, deserializer, ctxt));
        }
        if (!root.isArray()) {
            // value is null or primitive
            return Collections.emptyList();
        }

        return StreamSupport.stream(root.spliterator(), false)
                .map(this::unwrap)
                .filter(node -> !node.isMissingNode())
                .map(node -> deserialize(p.getCodec(), node, deserializer, ctxt))
                .collect(Collectors.toList());
    }

    private JsonNode unwrap(JsonNode node) {
        if (node.isArray()) {
            if (node.isEmpty()) {
                return MissingNode.getInstance();
            }

            return node.iterator().next();
        }

        return node;
    }

    private ValueModel deserialize(ObjectCodec codec, JsonNode value, JsonDeserializer<Object> valueDeser, DeserializationContext ctxt) {
        try (JsonParser jsonParser = createNestedParser(codec, value)) {
            return (ValueModel) valueDeser.deserialize(jsonParser, ctxt);
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
    }

    private JsonParser createNestedParser(ObjectCodec codec, JsonNode value) throws IOException {
        TokenBuffer buffer = new TokenBuffer(codec, false);
        codec.writeTree(buffer, value);

        JsonParser parser = buffer.asParser();
        parser.nextToken();

        return parser;
    }
}

カスタムデシリアライザを登録するには、使用することができ@JsonDeserialize、注釈を。

@JsonDeserialize(using = ValuesModelJsonDeserializer.class)
private List<ValueModel> values;

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=339437&siteId=1