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

时间:2015-05-11 18:24:58

标签: java json

我正在使用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标记的占位符。 这有什么简单的方法吗?

3 个答案:

答案 0 :(得分:7)

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

类 - ProposalAggregation

setBounds()

}

测试主要课程 请注意,我修改了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();
        }

    }

}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

OP尚不清楚,但如果你甚至不需要课程,Jackson可以将JSON反序列化为HashMaps的HashMap,也可以反过来。 link to a blog doing the same

相关问题