使用json-lib将JSONObject转Java对象,JSONArray转Java集合

来源:互联网 发布:袁和平 知乎 编辑:程序博客网 时间:2024/06/02 05:23

解析用的json包

gradle 引用

net.sf.json-lib:json-lib:2.4:jdk15

待转换用的Json对象(userString)

{    "Name": "nameA",    "title": "title1",    "orders": [        {            "Sn": 123,            "amount": 20.50,            "items": [                {                    "pid": "p_1",                    "pName": "p1_name"                }            ]        },        {            "Sn": 456,            "amount": 23.00,            "items": [                {                    "pid": "p_2",                    "pName": "p2_name"                }            ]        }    ]}

待转换用的Json数组(userArrString)

[    {        "Name": "nameA",        "title": "title1",        "orders": [            {                "Sn": 123,                "amount": 30.50,                "items": [                    {                        "pid": "p_1",                        "pName": "p1_name"                    }                ]            },            {                "Sn": 456,                "amount": 24.50,                "items": [                    {                        "pid": "p_2",                        "pName": "p2_name"                    }                ]            }        ]    },    {        "Name": "nameB",        "title": "title2",        "orders": [            {                "Sn": 223,                "items": [                    {                        "pid": "p_3",                        "pName": "p3_name"                    }                ]            },            {                "Sn": 446,                "items": [                    {                        "pid": "p_5",                        "pName": "p5_name"                    }                ]            }        ]    }]

对应的三个Java类,省略了相应的getter/setter方法

一个User对应多个Order,一个Order对应多个Item

public class User implements Serializable {    private String name;    private List<Order> orders;    .....}public class Order implements Serializable {    private String sn;    private BigDecimal amount;    private Set<Item> items;    ......}public class Item implements Serializable {    private String pid;    private String pName;    ......}

JsonObject转java对象

@Testpublic void testJson2Obj() {    try {        JSONObject userJson = JSONObject.fromObject(userString);        User u = (User) JSONObject.toBean(userJson, getJsonConfig());        printUser(u);    } catch (Exception e) {        e.printStackTrace();    }}/*** 因json对象中的key以大写字母开头,而java类中的属性是小写字母* 此方法用于将json中的key的首字母变为小写,以适应java类中的属性名**/class unCapitalPropertyNameProcessor implements PropertyNameProcessor {    @Override    public String processPropertyName(Class arg0, String arg1) {        return StringUtils.uncapitalize(arg1);    }}/*** 定义jsonConfig**/private JsonConfig getJsonConfig() {    JsonConfig jsonConfig = new JsonConfig();    //要将json转为user    jsonConfig.setRootClass(User.class);    //设置json中数组要对应的java对象    Map<String, Class<?>> map = new HashMap<String, Class<?>>();    map.put("orders", Order.class);    map.put("items", Item.class);    jsonConfig.setClassMap(map);    //注册java属性名处理器    //如果不注册的话,会因为json中的key的值与java中的属性名称不同而无法将value值设置到相应的java属性中    jsonConfig.registerJavaPropertyNameProcessor(User.class, new unCapitalPropertyNameProcessor());    jsonConfig.registerJavaPropertyNameProcessor(Order.class, new unCapitalPropertyNameProcessor());    return jsonConfig;}

JSONArray转Java集合

JSON数组转java集合与json对象转java对象相同

@Testpublic void testJsonArray2List() {    JSONArray userJsonArr = JSONArray.fromObject(userArrString);    List<User> list = (List<User>) JSONArray.toCollection(userJsonArr, getJsonConfig());    for (User u : list) {        printUser(u);    }}
1 0
原创粉丝点击