使用JSON中的值填充数组

时间:2010-10-11 07:20:29

标签: java json

在开始之前,这是我的JSON :(结构很僵硬,无法更改)

[
  {"_id":{"country":"au", "industry":"foo"}, "value":{"count":2}},
  {"_id":{"country":"au", "industry":"bar"}, "value":{"count":1}},
  {"_id":{"country":"be", "industry":"baz"}, "value":{"count":2}},
  ..
]

我不能拥有重复的国家/地区名称和行业名称。我有一个数组,用

填充值

array [au] [foo] = 2

array [au] [bar] = 1

array [be] [baz] = 2

JSON中的值未排序,并且所有国家/地区可能没有相同的行业。

我该怎么做呢?这是我目前的代码:

for (int i = 0; i < jsonArray.size(); i++) {
        JSONObject jsonValue = jsonArray.get(i).isObject();

        JSONObject _id = jsonValue.get("_id").isObject();
        JSONObject value = jsonValue.get("value").isObject();

        String country = _id.get("country").isString().toString();
        setCountry.add(country);

        String industry = _id.get("industry").isString().toString();
        setIndustry.add(industry);

        int count = Integer.parseInt(value.get("count").isNumber()
                .toString());

    }

我将国家和行业添加到一个集合中,以删除重复项。这就是导致计数问题的原因。我不关心它是否优雅,hackjob也会这样做。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你可以利用enum来解决你的问题。在这样的枚举中定义所有已知的国家名称和行业。

public enum Country {
au,
be;
int Int=this.ordinal();//just a short name for ordinal
}

public enum Industry {
foo,
bar,
baz;
int Int=this.ordinal();
}

现在定义一个2d int数组,你可以使用这样的enum来设置值:

int[][] value=new int[Country.values().length][Industry.values().length];
value[Country.au.Int][Industry.bar.Int]=2;
//Read from JSON
value[Country.valueOf("au").Int][Industry.valueOf("bar").Int]=2;

如果使用枚举:

,可以将此代码添加到当前for循环的末尾
value[Country.valueOf(country).Int][Industry.valueOf(industry).Int]=count;

另一种选择是避免使用数组并改为使用Map:

Map<Country,Map<Industry,Integer>> m=new HashMap<Country,Map<Industry,Integer>>();

或只是没有枚举:

Map<String,Map<String,Integer>> m=new HashMap<String,Map<String,Integer>>();

map的问题在于从它添加和检索值有点棘手,但你可以编写常用方法来完成这项工作。

<强>更新

向内部地图添加值:

String[][] countryAndIndustry= {{"au","foo"},{"au","bar"},{"be","baz"}};
Integer[] count= {2,1,2};
HashMap<String,HashMap<String,Integer>> hm=new HashMap<String,    HashMap<String,Integer>>();
for(int i=0;i<count.length;i++)
{
    HashMap<String,Integer> innerMap=hm.get(countryAndIndustry[i][0]);
    if(innerMap==null)
    {
        innerMap=new HashMap<String, Integer>();
        hm.put(countryAndIndustry[i][0],innerMap);
    }
    innerMap.put(countryAndIndustry[i][1],count[i]);
}