如何正确地将数据添加到嵌套的hashmap

时间:2015-04-16 19:52:38

标签: java json string

我正在解析json文件并将架构信息添加到嵌套的哈希映射中。但是当我尝试打印嵌套的hashmap时,它为我提供了所有key的相同值。有关如何将数据存储到嵌套hashmap的需求帮助正确。

我的json文件:

{
  "status":"success",
  "tables":[
      {
         "dbname":"idn",
        "tableName":"my_monthly_hits_b",
        "schema":"(cm11:chararray)",
        "location":"/user/mydb/"
      },
      {
         "dbname":"idn",
         "tableName": "my_monthly_match",
         "schema":"(city:chararray,match:chararray,cm11:chararray)",
         "location":"/user/mydb1"
      }
   ]
}

我的代码:

public Map<String,Map<String,String>> getDataTypes(String responsePath){
  Map<String,Map<String,String>> maped = new HashMap<String,Map<String,String>>();
Map<String,String> colDataTypes = new HashMap<String,String>();
try{
JsonParser parser = new JsonParser();
Object obj = parser.parse(new FileReader(responsePath);
JsonObject jObj = (JsonObject) obj;
JsonArray jArray = (JsonArray) jObj.get("tables");
Iterator<JsonElement> itr = jArray.iterator();

while(itr.hasNext())
{
    JsonObject  innerObj = (JsonObject) itr.next();
    JsonElement shm = innerObj.get("schema");
    JsonElement jTableName = innerObj.get("tableName");
    String tableName = jTableName.toString();
    String ss = shm.toString().replaceAll("\"","").replaceAll("[()]",""):
    System.out.println("The required JSON string --->" + ss);
    if(ss.contains(","){
       String[] str = ss.split(",");
       for(String s: str){
          String[] ptr = s.split(":");
          colDataTypes.put(prt[0],ptr[1]);
       }
   }
   else{
       String[] str1 = ss.split(":");
       colDataTypes.put(str1[0],str1[1]);
  }
  maped.put(tabName,colDataTypes);
  for(String tab : maped.keySet()){
     System.out.println("#####" + "Table Name " + tab + "value" + maped.get(tab));
}
}
}
catch(FileNotFoundException ex)
{
}
return maped;
}

1 个答案:

答案 0 :(得分:0)

您可以使用像Jackson这样的库来操作JSON树(如此处所示)或将JSON编组到对象图中。

package foo;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class Foo {

    public static void main(String[] args) throws Exception {
        final ObjectMapper mapper = new ObjectMapper();
        final JsonNode node = mapper.readTree("{  " + 
                "   \"status\":\"success\"," + 
                "   \"tables\":[  " + 
                "      {  " + 
                "         \"dbname\":\"idn\"," + 
                "         \"tableName\":\"my_monthly_hits_b\"," + 
                "         \"schema\":\"(cm11:chararray)\"," + 
                "         \"location\":\"/user/mydb/\"" + 
                "      }," + 
                "      {  " + 
                "         \"dbname\":\"idn\"," + 
                "         \"tableName\":\"my_monthly_match\"," + 
                "         \"schema\":\"(city:chararray,match:chararray,cm11:chararray)\"," + 
                "         \"location\":\"/user/mydb1\"" + 
                "      }" + 
                "   ]" + 
                "}");

        final ArrayNode tables = (ArrayNode) node.get("tables");

        // Add a new schema
        final ObjectNode newSchema = tables.addObject();

        newSchema.put("dbname", "foo db name");
        newSchema.put("tableName", "foo table name");
        newSchema.put("schema", "(foo:chararray,bar:chararray)");
        newSchema.put("location", "/foo/bar");

        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        System.out.println(mapper.writeValueAsString(node));
    }
}

上面的示例将打印:

{
  "status" : "success",
  "tables" : [ {
    "dbname" : "idn",
    "tableName" : "my_monthly_hits_b",
    "schema" : "(cm11:chararray)",
    "location" : "/user/mydb/"
  }, {
    "dbname" : "idn",
    "tableName" : "my_monthly_match",
    "schema" : "(city:chararray,match:chararray,cm11:chararray)",
    "location" : "/user/mydb1"
  }, {
    "dbname" : "foo db name",
    "tableName" : "foo table name",
    "schema" : "(foo:chararray,bar:chararray)",
    "location" : "/foo/bar"
  } ]
}