创建唯一对象实例变量

时间:2014-12-13 00:27:03

标签: java json gson

来自here的原始代码 查看下面的代码(忽略import语句):

public class JsonTest2 {

public static void main(String[] args){
    Gson gson = new Gson();
    JsonParser jsonParser = new JsonParser();
    JsonReader reader = null;

    try {
    reader = new JsonReader(new InputStreamReader(new 
        FileInputStream("./twitterUser.json")));
    }
    catch (IOException e) {
    }

    JsonArray userArray = jsonParser.parse(reader).getAsJsonArray();

    List<TwitterUser> twitterUsers = new ArrayList<TwitterUser>();
    //For each element in the JSON array, create a new TwitterUser
    //and populate with the json data:
    for ( JsonElement aUser : userArray ) { 
        TwitterUser aTwitterUser = 
            gson.fromJson(aUser, TwitterUser.class);
        twitterUsers.add(aTwitterUser);
    }
    //For each new TwitterUser that was created, print them out:
    for ( TwitterUser tUser : twitterUsers) {
        System.out.println(tUser);
    }
  }
}

创建数组List twitterUsers = new ArrayList();并包含两个TwitterUser实例。

如何单独引用每个实例(它们的变量名称是什么)?如果这不可能,例如你只能使用TwitterUser[0],我怎样才能使用JSON创建五个对象,每个对象都带有单独的变量名? 也可能需要围绕这个主题进行一些解释......

2 个答案:

答案 0 :(得分:1)

List不是数组。 ArrayList是由数组支持的List(您无法直接访问)。而是使用List接口

  1. List.get(int) 返回此列表中指定位置的元素。
  2. 使用List.iterator()来迭代List,也许间接使用for-each loop
  3. 所以,对于第一种情况

    TwitterUser tu = twitterUsers.get(0); // <-- get the first TwitterUser
                                          //     in the List.
    

    或第二次

    for (TwitterUser tu : twitterUsers) {
      // do something with each TwitterUser in tu
    }
    

答案 1 :(得分:0)

  

如何单独引用每个实例

作为twitterUsers[0]twitterUsers[1]

  

(他们的变量名是什么)?

它们不是变量,也没有名称。

  

如果不可能,例如你只能使用TwitterUser [0],我如何使用JSON创建五个对象,每个对象都有各自的变量名?

你做不到。变量命名您在源代码中编写的内容...在编译之前。库类(例如您正在使用的JSON库)只能在运行时...在编译源代码后执行操作。

但是如果你真的想要不同的变量,那么只要你知道 需要多少变量就很容易编写你的代码来做到这一点; e.g。

TwitterUser userOne = twitterUsers[0];
TwitterUser userTwo = twitterUsers[1];

显然,这是假设您将接收的JSON数组中至少有两个元素的布线。


这是个好主意吗?可能不是:

  • 它不会缩放。

  • 如果要填充的变量数不是常数,则代码会变得相当复杂和脆弱。 (您可以将它们初始化为null,但每次使用变量时都必须处理可能的空值!)

  • 您是通常不应硬接线的硬接线假设。 (至少应该检查JSON数组中的元素数量是否符合您的预期......并将错误的假设视为错误!)

  • 但在某些情况下,它可以使代码更容易阅读;例如如果命名变量(userOneuserTwo)将被广泛使用,或者它们具有更多描述性名称。


使用Map而不是变量怎么样?它确实可以扩展(排序),但是当数组中的条目数可变时,您仍然会遇到问题。代码更复杂。