Как использовать имя объекта json в качестве инкрементного значения? - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в JSON, мне нужен определенный формат вывода JSON из Jackson API. Вот действительно нужный вывод:

    {
        "0": {
            "symbol": "B",
            "count": 2,
            "symbolIndex": [0, 0]
        },
        "1": {
            "symbol": "B",
            "count": 2,
            "symbolIndex": [0, 0]
        },
        "2": {
            "symbol": "B",
            "count": 2,
            "symbolIndex": [0, 0]
        }
    }

Учтите, что имена объектов могут варьироваться (0,1,2,3,4,5....) и зависят от требований, и они могут быть только в инкрементном порядке. Как я могу использовать объект для генерации этого вывода JSON в Java, используя Jackson API?

Обновление

Итак, я получил ответ от Тома, и полный код выглядит следующим образом:

MainClass.java

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MainClass {
    public static void main(String[] args) {
        SymbolCounts symbolCounts = new SymbolCounts();
        symbolCounts.add("0", new MySymbol("A", 2, new int[]{1,1}));
        symbolCounts.add("1", new MySymbol("B", 2, new int[]{1,1}));
        symbolCounts.add("2", new MySymbol("C", 2, new int[]{1,1}));
        String str = getJSONResponse(symbolCounts);
        System.out.println(str);
    }
    protected static String getJSONResponse(SymbolCounts responseData) {
        String jsonStringResponse = "";
        try {
            ObjectMapper mapper = new ObjectMapper();
            jsonStringResponse = mapper.writeValueAsString(responseData);
        } catch (JsonProcessingException jsonProcessingException) {
            System.out.println(jsonStringResponse);
        }
        return jsonStringResponse;
    }
}

SymbolCounts.java

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashMap;
import java.util.Map;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown=true)
public class SymbolCounts {
    @JsonProperty("symbolCounts")
    private Map<String, MySymbol> symbolMap = new HashMap<String, MySymbol>();
    @JsonAnySetter
    public void add(String key, MySymbol value) {
        symbolMap.put(key, value);
    }
    public Map<String, MySymbol> getSymbolMap() {
        return symbolMap;
    }
    public void setSymbolMap(Map<String, MySymbol> symbolMap) {
        this.symbolMap = symbolMap;
    }
    @Override
    public String toString() {
        return "SymbolCounts{" +
                "symbolMap=" + symbolMap +
                '}';
    }
}

MySymbol.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.Arrays;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown=true)
public class MySymbol {
    private String symbol;
    private int count;
    private int[] symbolIndex;
    public MySymbol() {
    }
    public MySymbol(String symbol, int count, int[] symbolIndex) {
        this.symbol = symbol;
        this.count = count;
        this.symbolIndex = symbolIndex;
    }
    public String getSymbol() {
        return symbol;
    }
    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public int[] getSymbolIndex() {
        return symbolIndex;
    }
    public void setSymbolIndex(int[] symbolIndex) {
        this.symbolIndex = symbolIndex;
    }
    @Override
    public String toString() {
        return "LineID{" +
                "symbol='" + symbol + '\'' +
                ", count=" + count +
                ", symbolIndex=" + Arrays.toString(symbolIndex) +
                '}';
    }
}

1 Ответ

1 голос
/ 23 июня 2019

Вы можете сделать это, используя карту и @ JsonAnySetter.

Ваш класс более высокого уровня будет выглядеть так:

private Map<String, MySymbol> symbolMap;

@JsonAnySetter
public void add(String key, MySymbol value) {
    symbolMap.put(key, value);
}

Ваш класс MySymbol будет просто:

private String symbol;
private Integer count;
private Integer[] symbolIndex;

Тогда вашим конечным результатом будет карта, где ключи - это ваши числовые значения в виде строк, а значения - ваши объекты символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...