繁体   English   中英

将深层嵌套的json转换为java对象,反之亦然

[英]Converting deeply nested json to java object and vice versa

我正在使用JAXB将我的json转换为java对象。 我面临的问题是它导致我创建了大量的类,除了充当json标签的占位符之外没有任何意义。

例如:考虑下面的json:

{
"proposalAggregation": {
    "Buys": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    },
    "Sells": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    },
    "TAChanges": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    },
    "Existing": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    },
    "Proposed": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    },
    "PIAChanges": {
        "Heading1": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        },
        "Heading2": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
        }
    }
}

}

现在要将此JSON反序列化为java对象,这些是我需要创建的java类:

Class ProposalAggregation --> this contains Buys, sells, existing, porposed,TAChanges, PIA

Class Buys extends Calculation
Class Sells extends Calculation
Class Existing extends Calculation
Class proposed extends Calculation
Class TAChanges extends Calculation
Class PIAChanges extends Calculation 
Class Calculation -- > this contains heading1 and heading2

class Heading1
Class Heading2

因此总共有9个类可以模仿JSON以上,如果我们看一下这些类的作用,它们只不过是JSON标记的占位符。 这有什么简单的方法吗?

您可以通过以下方式实施Google的GSON库。 已经显示了一个示例类,您可以进一步修改它。

类 - ProposalAggregation

package com.test;

import java.util.Map;

public class ProposalAggregation {

private Map<String, Map<String, String>> Buys;
private Map<String, Map<String, String>> Sells;
private Map<String, Map<String, String>> TAChanges;

public Map<String, Map<String, String>> getBuys() {
    return Buys;
}

public void setBuys(Map<String, Map<String, String>> buys) {
    Buys = buys;
}

public Map<String, Map<String, String>> getSells() {
    return Sells;
}

public void setSells(Map<String, Map<String, String>> sells) {
    Sells = sells;
}

public Map<String, Map<String, String>> getTAChanges() {
    return TAChanges;
}

public void setTAChanges(Map<String, Map<String, String>> tAChanges) {
    TAChanges = tAChanges;
}

public String toString() {
    return "BUYS=" + this.Buys + " \nSELLS=" + this.Sells + " \nTACHANGES="
            + this.TAChanges;
}

}

测试主类请注意,我修改了key名只是为了验证转换是否正确。

package com.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.google.gson.Gson;

public class TestClass {

    public static void main(String[] args) {
        Gson gson = new Gson();

        try {

            String jsonString = " { 'Buys': { 'bHeading1': { 'bkey1': 'value1', 'bkey2': 'value2', 'bkey3': 'value3' }, 'bbHeading2': { 'bbkey1': 'value1', 'bbkey2': 'value2', 'bbkey3': 'value3' } }, "
                    + "'Sells': { 'sHeading1': { 'skey1': 'value1', 'skey2': 'value2', 'skey3': 'value3' }, 'ssHeading2': { 'sskey1': 'value1', 'sskey2': 'value2', 'sskey3': 'value3' } }, "
                    + "'TAChanges': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'Existing': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'Proposed': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'PIAChanges': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } } }";


            // convert to java class
            ProposalAggregation obj = gson.fromJson(jsonString, ProposalAggregation.class);
            System.out.println("OBJECT : " + obj);

            // convert to json
            String jsonStringFromObj = gson.toJson(obj);
            System.out.println("JSON : " + jsonStringFromObj);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

这是输出。

OBJECT : BUYS={bHeading1={bkey1=value1, bkey2=value2, bkey3=value3}, bbHeading2={bbkey1=value1, bbkey2=value2, bbkey3=value3}} 
SELLS={sHeading1={skey1=value1, skey2=value2, skey3=value3}, ssHeading2={sskey1=value1, sskey2=value2, sskey3=value3}} 
TACHANGES={Heading1={key1=value1, key2=value2, key3=value3}, Heading2={key1=value1, key2=value2, key3=value3}}
JSON : {"Buys":{"bHeading1":{"bkey1":"value1","bkey2":"value2","bkey3":"value3"},"bbHeading2":{"bbkey1":"value1","bbkey2":"value2","bbkey3":"value3"}},"Sells":{"sHeading1":{"skey1":"value1","skey2":"value2","skey3":"value3"},"ssHeading2":{"sskey1":"value1","sskey2":"value2","sskey3":"value3"}},"TAChanges":{"Heading1":{"key1":"value1","key2":"value2","key3":"value3"},"Heading2":{"key1":"value1","key2":"value2","key3":"value3"}}}

使用杰克逊代替JAXB。 有关详细信息,请参阅以下链接。 http://wiki.fasterxml.com/JacksonInFiveMinutes

OP不清楚,但如果你甚至不需要类,杰克逊可以将JSON反序列化为HashMaps的HashMap,也可以反过来。 链接到博客做同样的事情

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM