【问题标题】:Parse JSON to Java object with dynamics objects in JSON-response使用 JSON 响应中的动态对象将 JSON 解析为 Java 对象
【发布时间】:2022-08-20 02:49:52
【问题描述】:

我正在尝试将 JSON 响应解析为 Java 对象,然后我想将其保存到 Postgresql。

我有以下 json 响应:

{
    \"success\": 1,
    \"results\": [
        {
            \"FI\": \"120986750\",
            \"event_id\": \"5164306\",
            \"cards\": {
                \"updated_at\": \"1660559432\",
                \"key\": \"AAA100\",
                \"sp\": {
                    \"cards\": {
                        \"id\": \"1\",
                        \"name\": \"Cards\",
                        \"odds\": [
                            {
                                \"id\": \"101\",
                                \"odds\": \"2.200\",
                                \"header\": \"Over\",
                                \"name\": \"11\"
                            },
                            {
                                \"id\": \"102\",
                                \"odds\": \"8.500\",
                                \"header\": \"Exactly\",
                                \"name\": \"11\"
                            },
                            {
                                \"id\": \"103\",
                                \"odds\": \"1.909\",
                                \"header\": \"Under\",
                                \"name\": \"11\"
                            }
                        ]
                    }
                }
            },
            \"corners\": {
                \"updated_at\": \"1660559431\",
                \"key\": \"AAA200\",
                \"sp\": {
                    \"corners\": {
                        \"id\": \"2\",
                        \"name\": \"Corners\",
                        \"odds\": [
                            {
                                \"id\": \"201\",
                                \"odds\": \"2.200\",
                                \"header\": \"Over\",
                                \"name\": \"10\"
                            },
                            {
                                \"id\": \"202\",
                                \"odds\": \"8.500\",
                                \"header\": \"Exactly\",
                                \"name\": \"10\"
                            },
                            {
                                \"id\": \"203\",
                                \"odds\": \"1.909\",
                                \"header\": \"Under\",
                                \"name\": \"10\"
                            }
                        ]
                    },
                    \"total_corners\": {
                        \"id\": \"3\",
                        \"name\": \"Total Corners\",
                        \"odds\": [
                            {
                                \"id\": \"204\",
                                \"odds\": \"17.000\",
                                \"name\": \"Under 6\"
                            },
                            {
                                \"id\": \"205\",
                                \"odds\": \"4.333\",
                                \"name\": \"6 - 8\"
                            },
                            {
                                \"id\": \"206\",
                                \"odds\": \"2.750\",
                                \"name\": \"9 - 11\"
                            },
                            {
                                \"id\": \"207\",
                                \"odds\": \"3.400\",
                                \"name\": \"12 - 14\"
                            },
                            {
                                \"id\": \"208\",
                                \"odds\": \"5.500\",
                                \"name\": \"Over 14\"
                            }
                        ]
                    }
                }
            }
        }
    ]
}

我开始创建一个这样的类:

public class PreMatchOdds {

    @JsonProperty(\"success\")
    private Integer success;
    @JsonProperty(\"results\")
    private List<Result> results = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    private final static long serialVersionUID = -8631993296159893856L;

getter and setters..

然后代替

    @JsonProperty(\"cards\")
    private Cards cards;

and

    @JsonProperty(\"corners\")
    private Corners corners;

我试过:

@JsonProperty(\"categories\")
@JsonAlias({\"cards\", \"corners\"})
private Categories categories;

在结果类中

public class Result implements Serializable {

    @JsonProperty(\"FI\")
    private String fi;
    @JsonProperty(\"event_id\")
    private String eventId;
    
    @JsonProperty(\"categories\")
    @JsonAlias({\"cards\", \"corners\"})
    private Categories categories;

    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    private final static long serialVersionUID = -683759794150688410L;

正确的方法是如何做到这一点,或者我必须为每个卡片和角落对象创建一个类?这只是一个例子,但在我的真实案例中,我有 20 个这样的对象。 我还想将对象键名设置为一个变量,因为我想将它映射到数据库中的一个字段。

我已经尝试并用谷歌搜索但没有找到我正在寻找或不真正理解的内容。 最后,我想将它保存到数据库中的表中,如下所示:

FI event_id category updated_at key market_id market odds_id odds header handicap name
FI value event_id value \"cards\" updated_at AAA100 cards.id cards.name odds.id odds.odds odds.header odds.handicap
\"corners\" AAA200 corners.id corners.name odds.id odds.odds odds.header odds.handicap odds.name
Example
120986750 5164306 cards 1660559432 AAA100 1 Cards 101 2.2 Over 11
120986750 5164306 cards 1660559432 AAA100 1 Cards 102 8.5 Exatly 11
120986750 5164306 cards 1660559432 AAA100 1 Cards 103 1.909 Under 11
120986750 5164306 corners 1660559431 AAA200 2 Corners 201 2.2 Over 10
120986750 5164306 corners 1660559431 AAA200 2 Corners 202 8.5 Exatly 10
120986750 5164306 corners 1660559431 AAA200 2 Corners 203 1.909 Under 10

    标签: java json


    【解决方案1】:

    通过定义许多类来处理动态内容很复杂。我建议直接使用 JSON 查询库转换 JSON。例如,使用乔森.

    https://github.com/octomix/josson

    反序列化

    Josson josson = Josson.fromJsonString(
        "{" +
        "    \"success\": 1," +
        "    \"results\": [" +
        "        {" +
        "            \"FI\": \"120986750\"," +
        "            \"event_id\": \"5164306\"," +
        "            \"cards\": {" +
        "                \"updated_at\": \"1660559432\"," +
        "                \"key\": \"AAA100\"," +
        "                \"sp\": {" +
        "                    \"cards\": {" +
        "                        \"id\": \"1\"," +
        "                        \"name\": \"Cards\"," +
        "                        \"odds\": [" +
        "                            {" +
        "                                \"id\": \"101\"," +
        "                                \"odds\": \"2.200\"," +
        "                                \"header\": \"Over\"," +
        "                                \"name\": \"11\"" +
        "                            }," +
        "                            {" +
        "                                \"id\": \"102\"," +
        "                                \"odds\": \"8.500\"," +
        "                                \"header\": \"Exactly\"," +
        "                                \"name\": \"11\"" +
        "                            }," +
        "                            {" +
        "                                \"id\": \"103\"," +
        "                                \"odds\": \"1.909\"," +
        "                                \"header\": \"Under\"," +
        "                                \"name\": \"11\"" +
        "                            }" +
        "                        ]" +
        "                    }" +
        "                }" +
        "            }," +
        "            \"corners\": {" +
        "                \"updated_at\": \"1660559431\"," +
        "                \"key\": \"AAA200\"," +
        "                \"sp\": {" +
        "                    \"corners\": {" +
        "                        \"id\": \"2\"," +
        "                        \"name\": \"Corners\"," +
        "                        \"odds\": [" +
        "                            {" +
        "                                \"id\": \"201\"," +
        "                                \"odds\": \"2.200\"," +
        "                                \"header\": \"Over\"," +
        "                                \"name\": \"10\"" +
        "                            }," +
        "                            {" +
        "                                \"id\": \"202\"," +
        "                                \"odds\": \"8.500\"," +
        "                                \"header\": \"Exactly\"," +
        "                                \"name\": \"10\"" +
        "                            }," +
        "                            {" +
        "                                \"id\": \"203\"," +
        "                                \"odds\": \"1.909\"," +
        "                                \"header\": \"Under\"," +
        "                                \"name\": \"10\"" +
        "                            }" +
        "                        ]" +
        "                    }" +
        "                }" +
        "            }" +
        "        }" +
        "    ]" +
        "}");
    

    转型

    JsonNode node = josson.getNode(
        "results.map(" +
        "    FI," +
        "    event_id," +
        "    categories: entries()" +
        "        .map(category: key," +
        "             value.updated_at," +
        "             value.key," +
        "             market_id: value.sp.*.id," +
        "             market: value.sp.*.name," +
        "             value.sp.*.odds)" +
        "        .unwind(odds)" +
        ").unwind(categories)");
    System.out.println(node.toPrettyString());
    

    输出

    [ {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "cards",
      "updated_at" : "1660559432",
      "key" : "AAA100",
      "market_id" : "1",
      "market" : "Cards",
      "id" : "101",
      "odds" : "2.200",
      "header" : "Over",
      "name" : "11"
    }, {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "cards",
      "updated_at" : "1660559432",
      "key" : "AAA100",
      "market_id" : "1",
      "market" : "Cards",
      "id" : "102",
      "odds" : "8.500",
      "header" : "Exactly",
      "name" : "11"
    }, {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "cards",
      "updated_at" : "1660559432",
      "key" : "AAA100",
      "market_id" : "1",
      "market" : "Cards",
      "id" : "103",
      "odds" : "1.909",
      "header" : "Under",
      "name" : "11"
    }, {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "corners",
      "updated_at" : "1660559431",
      "key" : "AAA200",
      "market_id" : "2",
      "market" : "Corners",
      "id" : "201",
      "odds" : "2.200",
      "header" : "Over",
      "name" : "10"
    }, {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "corners",
      "updated_at" : "1660559431",
      "key" : "AAA200",
      "market_id" : "2",
      "market" : "Corners",
      "id" : "202",
      "odds" : "8.500",
      "header" : "Exactly",
      "name" : "10"
    }, {
      "FI" : "120986750",
      "event_id" : "5164306",
      "category" : "corners",
      "updated_at" : "1660559431",
      "key" : "AAA200",
      "market_id" : "2",
      "market" : "Corners",
      "id" : "203",
      "odds" : "1.909",
      "header" : "Under",
      "name" : "10"
    } ]
    

    【讨论】:

    • 谢谢你。这看起来真的很有趣。需要对此进行调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多