【问题标题】:Jackson json streaming api for multiple occurances杰克逊 json 流媒体 API 多次出现
【发布时间】:2011-03-20 21:04:11
【问题描述】:

我正在尝试使用 jackson 解析一些 json,并且我的代码基于网站上的示例,但我没有收到解析错误,因为该字段返回 null。我在下面列出了我的解析代码和我的类,谁能告诉我我哪里出错了?

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;}
}

【问题讨论】:

    标签: jackson


    【解决方案1】:

    这不是确切的答案,但我想知道为什么您不使用数据绑定而是手动代码来做同样的事情?如果适用,数据绑定会将代码压缩到几行。

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

    【讨论】:

    • json 包含在第 1 行的字符串中。我使用流媒体作为完成任务的最快方式。应用程序的性能至关重要
    • 好的。只是询问(wrt perf),因为它似乎正在执行数据库任务,因此 json 处理可能不是瓶颈。但是流媒体可以有更多(30-50%)的吞吐量,这很公平。但我仍然想知道您收到的错误:消息是什么?
    • 字符串字段名 = jp.getCurrentName(); fieldname' 包含 null 并在第一个令牌上生成异常
    • 啊。看JSON,代码,你是不是忘了处理START_OBJECT之前的START_ARRAY?
    • 没有看到 START_ARRAY 命令!这就是问题所在-感谢您的帮助:-)
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2019-05-02
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多