【问题标题】:Jackson databind read json tri-dimensional arrayJackson数据绑定读取json三维数组
【发布时间】:2014-02-11 19:01:24
【问题描述】:

我想读取一个 json 数组,如果可能的话,把它放到一个 int 三维数组中。

数据看起来像这样,我可以更改它的设计以满足我的需要,因为它还没有完成。这些值是愚蠢的,但要知道的是(Caution mindf*ck ahead)我必须嵌套未知数量的包含整数的数组,在重复三次或更少的数组中嵌套两次在根节点中。

I.E. int[3 or less][2][unknown int] = val

我编写了密钥以提高可读性,它们可能是也可能不是实际 json 的一部分。

{
    demand : {
        0 : {
           0 :{
               0 :22,
               1 :32,
               2 :21
            },
            1 :{
               0 :2762,
               1 :352,
               2 :231
            }
        },
        1 :{
            0 :{
               0 :222,
               1 :232,
               2 :621
             },
             1 :{
               0 :272,
               1 :37762,
               2 :261 
             }
         }
     }
}

关键是键和值都是整数,我想用它创建一个int [][][]。我认为答案就在这个文档中:Jackson Full Databinding,但我不明白它如何适用于我的数据。

我正在考虑一些 ObjectMapper.readValue(json, new TypeReference>() { })` 并将继续研究,但我没有太大希望。

感谢您的帮助!

编辑这是实际有效的 JSON

[  [   [  22, 32,  21   ],  [ 2762,  352, 231 ] ], [    [  222, 232,  621 ],  [ 272,  37762, 261]] ]

【问题讨论】:

  • 首先,您描述为想要的 JSON 是无效的 JSON。 JSON 中的键是 strings。其次,即使我们假设键是字符串,您所描述的是 Java Map<String, Map<String, Map<String, Integer>>> Json 中的三维数组将是 [ [ [22,32,21],[2762,352,231] ],[ [222,232], ... ] ] ]
  • 就像我说的,这些键可能是也可能不是我为了可读性而编写的实际 JSON 数据的一部分。方括号符号确实是数组的正确符号,我稍后会相应地进行编辑。不过,我还得弄清楚如何处理杰克逊。

标签: java json multidimensional-array jackson primitive


【解决方案1】:

我不确定这是否能回答您的问题,但我认为您始终可以使用迭代器和拆分,例如:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sf.json.JSONObject;

public class test {
    /**
 * @param args
 */
@SuppressWarnings("unchecked")
public static void main(String[] args) {
    Map <String, Object> map1 = new HashMap<String, Object>();
    Map <String, Object> map2 = new HashMap<String, Object>();
    Map <String, Map> map3 = new HashMap<String, Map>();
    map1.put("0","22,32,21");
    map1.put("1", "2762,352,231");
    map2.put("0", "222,232,621");
    map2.put("1","272,37762,261");
    map3.put("0",map1 );
    map3.put("1",map2);
    JSONObject jsonobj = JSONObject.fromObject(map3);  // creating json object
    Iterator it = jsonobj.keys();
    int maxZ = 0; //find out the length of the last dimension
    while(it.hasNext()) {
        JSONObject jobj = (JSONObject) jsonobj.get(it.next());
        Iterator it2 = jobj.keys();
        while(it2.hasNext()) {
            if(((String)jobj.get(it2.next())).split(",").length > maxZ){
                maxZ= ((String)jobj.get(it2.next())).split(",").length;
                }
        }
    }
    int[][][] result= new int [jsonobj.size()][2][maxZ]; //creating 3D array of the right size
    int x = 0, y = 0, z = 0;
    it = jsonobj.keys();
    while(it.hasNext()) {
        JSONObject jobj = (JSONObject) jsonobj.get(it.next());
        Iterator it2 = jobj.keys();
        y = 0; //reset y
        while(it2.hasNext()) {
            String[]s =((String)jobj.get(it2.next())).split(",");
            z = 0; //reset z
            for (String str : s) {
                result[x][y][z] = Integer.parseInt(str);
                z++;
            }
        y++;
        }
    x++;
    }
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            for (int k = 0; k < z; k++) {
                System.out.print(result[i][j][k]);
                System.out.print(" ");
            }
            System.out.println("\n");
            }
        }
    }
}

输出:

272 37762 261 

222 232 621 

2762 352 231 

22 32 21 

不知道为什么这是延期交货,如果这没有帮助很抱歉:P

【讨论】:

    【解决方案2】:

    使用 Jackson 序列化/反序列化数组与序列化其他任何东西相同:

    public class App 
    {
        public static void main(String[] args) throws JsonProcessingException {
    
            int[][][] a = new int[2][3][2];
            a[0][2][0] = 3;
    
            ObjectMapper om = new ObjectMapper();
    
            // Serialize to JSON
            String json = om.writeValueAsString(a);
            System.out.println(json);
    
            // deserialize back from JSON
            a = om.readValue(json, int[][][].class);
            System.out.println(a[0][2][0]);
    
       }
    }
    

    输出:

    [[[0,0],[0,0],[3,0]],[[0,0],[0,0],[0,0]]]
    3

    也就是说,除非您知道它始终是一个 3 维数组,否则使用 Lists 会更好地为您服务

    【讨论】:

    • 非常感谢,这解决了。我认为我不能在不是类中明确定义的对象的类型上使用.class。我对杰克逊教程谈到的通用类型感到困惑。现在我知道generic type 是什么,我又回到了正轨。
    • @Johnride 不用担心。 java中的数组很奇怪。它们是一流的对象,来自一个类……它不是一个可以扩展的对象,它具有特殊的属性(索引运算符)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多