用GSON解析JSON文件 [英] Parsing a JSON file with GSON

查看:146
本文介绍了用GSON解析JSON文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法将JSON文件读入POJO。让我给你一个我的JSON文件需要的片段:

  {
Speidy:{
factionId:2,
角色:ADMIN,
title:,
power:9.692296666666667,
powerBoost: 0.0,
lastPowerUpdateTime:1337023306922,
lastLoginTime:1337023306922,
chatMode:PUBLIC
},
ShadowSlayer272:{
factionId:2,
角色:NORMAL,
title:,
power:0.8673466666666667,
powerBoost :0.0,
lastPowerUpdateTime:1336945426926,
lastLoginTime:1336945426926,
chatMode:PUBLIC
},

我的问题是第一个'节点'是完全随机的,即如果每次都不同,我该如何为它创建一个POJO文件?



子数据的POJO文件如下所示:

  public cla ss节点{
private int factionId = 0;
private String role =;
private String title =;
私人双倍电量= 0.0;
private double powerBoost = 0.0;
private int lastPowerUpdateTime = 0;
private int lastLoginTime = 0;
private String chatMode =;
}

然后我的其他POJO文件就是这样的:

  public class Container {
private List< Node>节点; // GSON需要什么节点来获取每个随机节点?

public List< Node> getNodes(){
返回节点;
}
}

感谢所有帮助,谢谢。



UPDATE



我尝试更改 List Map ,例如:

  public class Container { 
私人地图< String,Node>节点;

public Map< String,Node> getNodes(){
返回节点;
}

保持节点文件不变。该字符串将是属性名称,即 Speidy ShadowSlayer272 。然而,gson从来不会对节点做任何事情,当我尝试并 getNodes()时,它会返回一个 null 对象。



感谢您的帮助。

解决方案

似乎是一个名称,您可能想要表示一个值,作为对象的属性名称。相反,将名称包含在JSON字符串中,并为其指定一个属性名称,该名称实际上将显示为Java节点类中的私有变量(带有getter和setter)。

有了这个,您应该能够将您的JSON反序列化为一个对象。此外,由于在服务器端您将Node集合表示为List,因此我将JSON转换为包含两个对象的数组。在JavaScript中,您可以将它们作为 node [0] .name node [1] .name 访问它们,将等同于服务器端的 nodes.get(0).getName()

  [
{
name:Speidy,
factionId:2,
role:ADMIN,
title:,
power:9.692296666666667,
powerBoost:0.0,
lastPowerUpdateTime:1337023306922,
lastLoginTime:1337023306922,
chatMode:PUBLIC
},
{
name:ShadowSlayer272,
factionId:2,
角色:NORMAL,
title:,
power:0.8673466666666667,
powerBoost:0.0,
lastPowerUpdateTime:1336945426926,
lastLoginTime:1336945426926,
chatMode:PUBLIC
}
]

public class Node {
private String name = ;

private int factionId = 0;
private String role =;
private String title =;
私人双倍电量= 0.0;
private double powerBoost = 0.0;
private int lastPowerUpdateTime = 0;
private int lastLoginTime = 0;
private String chatMode =;
}

这就是说,如果你确实需要使用该名称作为属性名称,然后考虑将JSON反序列化为HashMap而不是List。列表通常映射到JSON数组,而地图通常更适合于在父对象内部表示几个JSON对象。


I'm having trouble reading a JSON file into a POJO. Let me give you a snippet of what my JSON file entails:

 {
    "Speidy": {
        "factionId": "2",
        "role": "ADMIN",
        "title": "",
        "power": 9.692296666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1337023306922,
        "lastLoginTime": 1337023306922,
        "chatMode": "PUBLIC"
    },
    "ShadowSlayer272": {
        "factionId": "2",
        "role": "NORMAL",
        "title": "",
        "power": 0.8673466666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1336945426926,
        "lastLoginTime": 1336945426926,
        "chatMode": "PUBLIC"
    },

My issue is the first 'node' is completely random, i.e how can I make a POJO file for it if it's different each time?

My POJO file for the sub-data is like this:

public class Node {
    private int factionId = 0;
    private String role = "";
    private String title = "";
    private double power = 0.0;
    private double powerBoost = 0.0;
    private int lastPowerUpdateTime = 0;
    private int lastLoginTime = 0;
    private String chatMode = "";
}

And then my other POJO file is this:

public class Container {
    private List<Node> nodes; //What should nodes be for GSON to get each random one?

    public List<Node> getNodes() {
        return nodes;
    }
}

I appreciate all help, thank you.

UPDATE

I tried changing the List to a Map as such:

public class Container {
    private Map<String,Node> nodes;

    public Map<String,Node> getNodes() {
        return nodes;
    }

While keeping the node file the same. The string would then be the property name i.e Speidy or ShadowSlayer272. However, gson never does anything with nodes, and when I try and to getNodes(), it returns a null object.

Thanks for the help.

解决方案

You're listing what appears to be a name, which you possibly meant to represent a value, as a property name for an object. Instead, include the name inside the JSON string and assign it a property name that will actually appear as a private variable (with getters and setters) in your Java Node class.

With this in place, you should then be able to deserialize your JSON back into an object. Also, since on the server-side you're representing the Node collection as a List, I converted the JSON to an array that contains two objects. In JavaScript, you'd access them as node[0].name and node[1].name, which would equate to nodes.get(0).getName() on the server-side:

[
    {
        "name" : "Speidy",
        "factionId": "2",
        "role": "ADMIN",
        "title": "",
        "power": 9.692296666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1337023306922,
        "lastLoginTime": 1337023306922,
        "chatMode": "PUBLIC"
    },
    {
        "name" : "ShadowSlayer272",
        "factionId": "2",
        "role": "NORMAL",
        "title": "",
        "power": 0.8673466666666667,
        "powerBoost": 0.0,
        "lastPowerUpdateTime": 1336945426926,
        "lastLoginTime": 1336945426926,
        "chatMode": "PUBLIC"
    }
]

public class Node {
    private String name = "";

    private int factionId = 0;
    private String role = "";
    private String title = "";
    private double power = 0.0;
    private double powerBoost = 0.0;
    private int lastPowerUpdateTime = 0;
    private int lastLoginTime = 0;
    private String chatMode = "";
}

With that said, if you really do need to use the name as a property name, then consider deserializing the JSON to a HashMap instead of a List. Lists generally map to JSON arrays, whereas Maps generally are better suited towards representing several JSON objects inside a parent object.

这篇关于用GSON解析JSON文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆