2011-04-19 36 views
0

我需要将这个king json文件加载到Java中的某个对象中。从json中加载元素列表

[ 
    { 
     "id": 1, 
     "name": "FA1_M", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 1, 
     "index_ring": 1, 
     "order": 0 
    }, 
    { 
     "id": 2, 
     "name": "A1_1_LED", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 1, 
     "index_ring": 2, 
     "order": 1 
    }, 
    { 
     "id": 3, 
     "name": "FA1_A", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 2, 
     "index_ring": 3, 
     "order": 2 
    }, 
    { 
     "id": 4, 
     "name": "A1_2_LED", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 2, 
     "index_ring": 4, 
     "order": 3 
    }, 
    { 
     "id": 5, 
     "name": "FA1_BMA", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 3, 
     "index_ring": 5, 
     "order": 4 
    }, 
    { 
     "id": 6, 
     "name": "A1_3_LED", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 3, 
     "index_ring": 6, 
     "order": 5 
    }, 
    { 
     "id": 7, 
     "name": "Reserve_IN_4", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 4, 
     "index_ring": 7, 
     "order": 6 
    }, 
    { 
     "id": 8, 
     "name": "A1_4_LED", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 4, 
     "index_ring": 8, 
     "order": 7 
    }, 
    { 
     "id": 9, 
     "name": "Reserve_IN_5", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 5, 
     "index_ring": 9, 
     "order": 8 
    }, 
    { 
     "id": 10, 
     "name": "A1_5_LED", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 5, 
     "index_ring": 10, 
     "order": 9 
    }, 
    { 
     "id": 11, 
     "name": "Reserve_IN_6", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 6, 
     "index_ring": 11, 
     "order": 10 
    }, 
    { 
     "id": 12, 
     "name": "Reserve_OUT_6", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 6, 
     "index_ring": 12, 
     "order": 11 
    }, 
    { 
     "id": 13, 
     "name": "Reserve_IN_7", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 7, 
     "index_ring": 13, 
     "order": 12 
    }, 
    { 
     "id": 14, 
     "name": "KK1_ENB", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 7, 
     "index_ring": 14, 
     "order": 13 
    }, 
    { 
     "id": 15, 
     "name": "FA2_BMA", 
     "ring_number": 1, 
     "type": 3, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 8, 
     "index_ring": 15, 
     "order": 14 
    }, 
    { 
     "id": 16, 
     "name": "KK2_ENB", 
     "ring_number": 1, 
     "type": 4, 
     "unit_index": 1, 
     "device_type": 3, 
     "address": 8, 
     "index_ring": 16, 
     "order": 15 
    }, 
    { 
     "id": 17, 
     "name": "Smoke1_1", 
     "ring_number": 1, 
     "type": 2, 
     "unit_index": 2, 
     "device_type": 2, 
     "address": 1, 
     "index_ring": 17, 
     "order": 16 
    }, 
    { 
     "id": 18, 
     "name": "Smoke1_2", 
     "ring_number": 1, 
     "type": 2, 
     "unit_index": 3, 
     "device_type": 12, 
     "address": 1, 
     "index_ring": 18, 
     "order": 17 
    }, 
    { 
     "id": 19, 
     "name": "Smoke1_3", 
     "ring_number": 1, 
     "type": 2, 
     "unit_index": 4, 
     "device_type": 2, 
     "address": 1, 
     "index_ring": 19, 
     "order": 18 
    }, 
    { 
     "id": 20, 
     "name": "Smoke1_4", 
     "ring_number": 1, 
     "type": 2, 
     "unit_index": 5, 
     "device_type": 2, 
     "address": 1, 
     "index_ring": 20, 
     "order": 19 
    }, 
    { 
     "id": 21, 
     "name": "Fire1_1", 
     "ring_number": 1, 
     "type": 1, 
     "unit_index": 6, 
     "device_type": 4, 
     "address": 1, 
     "index_ring": 21, 
     "order": 20 
    }, 
    { 
     "id": 22, 
     "name": "Fire1_2", 
     "ring_number": 1, 
     "type": 1, 
     "unit_index": 6, 
     "device_type": 4, 
     "address": 2, 
     "index_ring": 22, 
     "order": 21 
    }, 
    { 
     "id": 23, 
     "name": "Fire1_3", 
     "ring_number": 1, 
     "type": 1, 
     "unit_index": 7, 
     "device_type": 1, 
     "address": 1, 
     "index_ring": 23, 
     "order": 22 
    }, 
    { 
     "id": 24, 
     "name": "Motorless1", 
     "ring_number": 1, 
     "type": 5, 
     "unit_index": 8, 
     "device_type": 13, 
     "address": 1, 
     "index_ring": 24, 
     "order": 23 
    }, 
    { 
     "id": 25, 
     "name": "Fire1_4", 
     "ring_number": 1, 
     "type": 1, 
     "unit_index": 9, 
     "device_type": 14, 
     "address": 1, 
     "index_ring": 25, 
     "order": 24 
    }, 
    { 
     "id": 26, 
     "name": "Fire1_5", 
     "ring_number": 1, 
     "type": 1, 
     "unit_index": 9, 
     "device_type": 14, 
     "address": 2, 
     "index_ring": 26, 
     "order": 25 
    } 
] 

我有类元素,描述一个元素

public class element { 
    protected int id; 
    protected int type; 
    protected String state; 
    protected int status; 
    protected int device_type; 
    private Map<String, Integer>mask; 


    public int getId(){return this.id;} 
    public void setId(int id){this.id=id;} 
    public int getType(){return this.type;} 
    public void setType(int type){this.type=type;} 
    public String getState(){return this.state;} 
    public void setState(String state){this.state=state;} 
    public int getStatus(){return this.status;} 
    public void setStatus(int status){this.status=status;} 
    public int getDeviceType(){return this.device_type;} 
    public void setDeviceType(int device_type){this.device_type=device_type;} 
    public Map<String,Integer> getMask(){return this.mask;} 
    public void setMask(Map<String,Integer> mask){this.mask=mask;} 

    //index start by 1, not 0 
    public boolean getBit(int index){ 
     return ((this.status>>(index-1)) & 0x1)==1; 
    } 

    public ElementView generateView(){ 
     return null; 
    } 

} 

如何在元素列表加载JSON?我使用GSON查看了stackoverflow questoion,但是需要在json中使用这个数组的名称,而我没有这个名称。任何人都可以帮忙吗?

+0

声明“需要h在json中给这个数组命名“并不正确。下面,adisembiring发布了一个反序列化到列表的合理解决方案。还有一个问题是原始问题中的JSON结构与Java结构不匹配,并且不清楚每个JSON元素应该如何绑定到各种Java组件。 – 2011-06-15 17:24:11

回答

0

使用JSON-Simple库,例如

Object obj=JSONValue.parse(jsonString); 
    JSONArray array=(JSONArray)obj; 
    JSONObject element0=(JSONObject)array.get(0); 

    Element el = new Element(); 
    el.setId(element0.get("id")); 
    ... 
0

看看杰克逊。与GSON相比,JSON更具有效率。我真的非常棒,我的对象先用Jackson发送给Json String,这样我就知道我的Json String需要的样子。这里有一个例子:

User user = new User(); 
     user.setFirstName("Kmb"); 
     .... 
     UserStatus userStatus = new UserStatus(); 
     userStatus.setKey("1"); 
     userStatus.setKey("active"); 
     user.setUserStatus(userStatus); 

     String strUser=""; 
     try { 
      strUser =mapper.writeValueAsString(user); 
     } catch (JsonGenerationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println(strUser); 

一旦你看到字符串应该如何格式调整输入匹配杰克逊希望的格式。然后将字符串与您的班级一起传递给映射器。

try { 
     String str; //your string here 
      User user2 = mapper.readValue(str, User.class); 
      System.out.println(user2.getFirstName()); 
      System.out.println(user2.getServiceType().getValue()); 

     } catch (JsonParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

如果你想要一个元素的数组,你可能需要创建一个简单的类来包装元素列表并通过Jackson运行它。

<dependencies> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.7.5</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.7.5</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 
    </dependencies> 
1

您需要指定您的元素类型/类。例如,你有数组JSON娄 [{"id":"01","name":"Joe"},{"id":"02","name":"Doe"}]

你必须建立学生类

public class Student { 
    private String id; 
    private String name; 

    public Student() { 

    } 

    public Student(String id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "Student [id=" + id + ", name=" + name + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((id == null) ? 0 : id.hashCode()); 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Student other = (Student) obj; 
     if (id == null) { 
      if (other.id != null) 
       return false; 
     } else if (!id.equals(other.id)) 
      return false; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 

} 

之后,你需要如下

public class When_serialize_list_object { 
    private List<Student> _students; 
    private Gson gson = new Gson(); 

    @Before 
    public void setUp() { 
     _students = new ArrayList<Student>(); 

     Student student1 = new Student("01", "Joe"); 
     Student student2 = new Student("02", "Doe"); 

     _students.add(student1); 
     _students.add(student2); 
    } 

    @Test 
    public void should_able_to_deserialize() {  
     String json = gson.toJson(_students); 

     System.out.println(json); 
     Type collectionType = new TypeToken<List<Student>>(){}.getType(); 
     List<Student> students = gson.fromJson(json, collectionType); 

     Assert.assertEquals(students, _students); 
     System.out.println(students); 
    } 

} 
指定 collection type, and access fromJson method

Type collectionType = new TypeToken<List<Student>>(){}.getType(); 
List<Student> students = gson.fromJson(json, collectionType); 

整个测试代码

+0

这合理地回答了这个问题,“如何在元素列表中加载json?” – 2011-06-15 17:24:42

+0

@AdiSembiring这里的Type是什么库? – GeekyOmega 2013-07-26 22:04:02

+1

@GeekyOmega google json – 2013-09-04 09:03:51