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

标签 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 标签的占位符。 有什么简单的方法吗?

最佳答案

您可以通过以下方式实现 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"}}}

关于java - 将深度嵌套的 json 转换为 java 对象,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174970/

相关文章:

java - 帮助 ant 文件 - Java 任务的类路径

java - 如何从java应用程序订阅apache kafka中的主题?

java - 使用 Jackson 反序列化时禁用标量到字符串的转换

java - Android 自定义 ListView 不使用 Volley 构建

java - 如何使用用户的证书?

java - 从 Java 获取 MS-Windows 安装的应用程序

ios - 等待数据加载到模型中,然后再在 ViewController 中访问它们

php - 带有某些 html 标记的 JSON 字符串在解析时失败

java - 处理功能键中的 JavaFX 事件

java - JSONP 与 Jersey