2011-03-20 36 views
0

我想解析一些json使用杰克逊和我已经基于我的代码在网站上的例子,但我没有得到解析错误,因为字段返回null。我已经列出了我的解析代码和我的课程,有谁能告诉我我哪里出错了?杰克逊json流API多个发生

String json2 = "[{\"odd\":\"110601\",\"oda\":\"MAN\",\"odt\":\"0655\",\"oad\":0,\"oaa \":\"IBZ\",\"oat\":\"1045\",\"rdd\":7,\"rda\":\"IBZ\",\"rdt\":\"1130\",\"rad\":7,\"raa\":\"MAN\",\"rat\":\"1315\",\"d\":7,\"sp\":[{ \"s\": \"test\", \"p\": \"1\" },{ \"s\": \"test\", \"p\": \"2\" },{ \"s\": \"test\", \"p\": \"3\" },{ \"s\": \"test\", \"p\": \"4\" }]}]"; 
    JsonFactory f = new JsonFactory(); 
    JsonParser jp = f.createJsonParser(json2); 
    Flight2 flight2 = new Flight2(); 
    jp.nextToken(); // will return JsonToken.START_OBJECT (verify?) 
    while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String fieldname = jp.getCurrentName(); 
     jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY 
     if ("sp".equals(fieldname)) { // contains an object 
      FlightSP flightsp = new FlightSP(); 
      while (jp.nextToken() != JsonToken.END_OBJECT) { 
       String namefield = jp.getCurrentName(); 
       jp.nextToken(); // move to value 
       if ("s".equals(namefield)) { 
        flightsp.setS(jp.getText()); 
       }else if ("p".equals(namefield)) { 
        flightsp.setP(jp.getText()); 
       } else { 
        throw new IllegalStateException("Unrecognized field '"+fieldname+"'!"); 
       } 
      } 
      flight2.setFlightSP(flightsp); 
     }else if ("odd".equals(fieldname)){ 
      flight2.setOdd(jp.getText()); 
     }else if ("oda".equals(fieldname)){ 
      flight2.setOda(jp.getText()); 
     }else if ("odt".equals(fieldname)){ 
      flight2.setOdt(jp.getText()); 
     }else if ("oad".equals(fieldname)){ 
      flight2.setOad(jp.getText()); 
     }else if ("oaa".equals(fieldname)){ 
      flight2.setOaa(jp.getText()); 
     }else if ("oat".equals(fieldname)){ 
      flight2.setOat(jp.getText()); 
     }else if ("rdd".equals(fieldname)){ 
      flight2.setRdd(jp.getText()); 
     }else if ("rda".equals(fieldname)){ 
      flight2.setRda(jp.getText()); 
     }else if ("rdt".equals(fieldname)){ 
      flight2.setRdt(jp.getText()); 
     }else if ("rad".equals(fieldname)){ 
      flight2.setRad(jp.getText()); 
     }else if ("raa".equals(fieldname)){ 
      flight2.setRaa(jp.getText()); 
     }else if ("rat".equals(fieldname)){ 
      flight2.setRat(jp.getText()); 
     }else { 
      throw new IllegalStateException("Unrecognized field '"+fieldname+"'!"); 
     } 
    } 
    jp.close(); // ensure resources get cleaned up timely and properly 

public class Flight2{ 

@Id 
Long id; 
private String _odd;//out_departure_date 
private String _oda;//out_departure_iata_code; 
private @Unindexed String _odt;//out_departure_time; 
private @Unindexed String _oad;//out_arrival_date; 
private String _oaa;//out_arrival_iata_code; 
private @Unindexed String _oat;//out_arrival_time; 
private @Unindexed String _rdd;//rtn_departure_date; 
private @Unindexed String _rda;//rtn_departure_iata_code; 
private @Unindexed String _rdt;//rtn_departure_time; 
private @Unindexed String _rad;//rtn_arrival_date; 
private @Unindexed String _raa;//rtn_arrival_iata_code; 
private @Unindexed String _rat;//rtn_arrival_time; 
private String _d;//duration; 
private @Unindexed FlightSP _flightsp;//table containing just supplier and price 

public void setFlightSP(FlightSP flightsp){_flightsp = flightsp;} 
public void setOdd(String odd) {_odd = odd;} 
public void setOda(String oda) {_oda = oda;} 
public void setOdt(String odt) {_odt = odt;} 
public void setOad(String oad) {_oad = oad;} 
public void setOaa(String oaa) {_oaa = oaa;} 
public void setOat(String oat) {_oat = oat;} 
public void setRdd(String rdd) {_rdd = rdd;} 
public void setRda(String rda) {_rda = rda;} 
public void setRdt(String rdt) {_rdt = rdt;} 
public void setRad(String rad) {_rad = rad;} 
public void setRaa(String raa) {_raa = raa;} 
public void setRat(String rat) {_rat = rat;} 

public FlightSP getFlightSP(){return _flightsp;} 
public String getOdd() {return _odd;} 
public String getOda() {return _oda;} 
public String getOdt() {return _odt;} 
public String getOad() {return _oad;} 
public String getOaa() {return _oaa;} 
public String getOat() {return _oat;} 
public String getRdd() {return _rdd;} 
public String getRda() {return _rda;} 
public String getRdt() {return _rdt;} 
public String getRad() {return _rad;} 
public String getRaa() {return _raa;} 
public String getRat() {return _rat;} 
} 

public class FlightSP { 
@Id 
Long id; 
private @Unindexed String _s, _p; 

public void setS(String s) {_s = s;} 
public void setP(String p) {_p = p;} 

public String getS() {return _s;} 
public String getP() {return _p;} 
} 

回答

1

这不是确切的答案,但我想知道,为什么你不使用数据绑定,但手工代码做同样的?如果适用的话,数据绑定会将代码缩小到几行。

但是究竟是什么错误?和什么样的JSON?

+1

json包含在第1行的字符串中。我使用流作为其最快的方式来完成任务。应用程序的性能至关重要 – cuthbert 2011-03-21 18:04:28

+0

好的。只是问(wrt perf),因为它似乎在做数据库任务,所以json处理可能不是瓶颈。但流媒体可以有更多(30-50%)的吞吐量,非常公平。 但是我仍然在想你得到的错误:这条消息是什么? – StaxMan 2011-03-22 19:14:26

+0

String fieldname = jp.getCurrentName(); fieldname'包含null并在第一个标记 – cuthbert 2011-03-22 22:37:35