简体   繁体   中英

Reading JSON data that begins with [ and ends with ]

I'm using Java with a plugin for NetBeans called CODAPPS to retrieve, parse, and display JSON data.

I'm following an example that used JSON data produced by Google's Firebase database, but I'm using SlashDB instead.

For some reason the JSON data from SlashDB begins and ends with [ and ] , respectively.

I get the following error:

org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
    at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
    at org.json.JSONObject.<init>(JSONObject.java:198)
    at org.json.JSONObject.<init>(JSONObject.java:325)
    at userclasses.StateMachine.onMain_ButtonAction(StateMachine.java:80)
    at generated.StateMachineBase.handleComponentAction(StateMachineBase.java:572)
    at com.codename1.ui.util.UIBuilder$FormListener.actionPerformed(UIBuilder.java:2831)
    at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:345)
    at com.codename1.ui.Button.fireActionEvent(Button.java:411)
    at com.codename1.ui.Button.released(Button.java:442)
    at com.codename1.ui.Button.pointerReleased(Button.java:530)
    at com.codename1.ui.Form.pointerReleased(Form.java:2578)
    at com.codename1.ui.Form.pointerReleased(Form.java:2514)
    at com.codename1.ui.Component.pointerReleased(Component.java:3119)
    at com.codename1.ui.Display.handleEvent(Display.java:2017)
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1065)
    at com.codename1.ui.Display.mainEDTLoop(Display.java:994)
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120)
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
Picked up _JAVA_OPTIONS: -Xmx4G
BUILD SUCCESSFUL (total time: 15 seconds)

My JSON data looks like this:

[
    {
        "description": "Example Fast Festival Motorcycle with Boho Beading",
        "title": "Example Fast Festival Motorcycle with Boho Beading",
        "price": "$154.00",
        "pic": "http://images.example-media.com/inv/media/3/8/8/8/5068883/print/image1xxl.jpg",
        "pic2": "http://images.example-media.com/inv/media/3/8/8/8/5068883/image2s.jpg",
        "pic3": "http://images.example-media.com/inv/media/3/8/8/8/5068883/image3s.jpg",
        "title_lower": "example glam festival motorcycle with boho beading",
        "desc_lower": "example glam festival motorcycle with boho beading"
    },
    {
        "description": "Example BIG Fast Festival Body-Conscious Motorcycle with Cut Out Detail",
        "title": "Example BIG Fast Festival Body-Conscious Motorcycle with Cut Out Detail",
        "price": "$50.00",
        "pic": "http://images.example-media.com/inv/media/9/8/2/8/5118289/print/image1xxl.jpg",
        "pic2": "http://images.example-media.com/inv/media/9/8/2/8/5118289/image2s.jpg",
        "pic3": "http://images.example-media.com/inv/media/9/8/2/8/5118289/image3s.jpg",
        "title_lower": "example petite glam festival body-conscious motorcycle with cut out detail",
        "desc_lower": "example petite glam festival body-conscious motorcycle with cut out detail"
    },
    {
        "description": "Example USED Premium  Ultra Fast Fishtail Maxi Motorcycle",
        "title": "Example USED Premium  Ultra Fast Fishtail Maxi Motorcycle",
        "price": "$67.00",
        "pic": "http://images.example-media.com/inv/media/4/2/7/1/4571724/red/image1xxl.jpg",
        "pic2": "http://images.example-media.com/inv/media/4/2/7/1/4571724/image2s.jpg",
        "pic3": "http://images.example-media.com/inv/media/4/2/7/1/4571724/image3s.jpg",
        "title_lower": "example red carpet premium scuba ultra glam fishtail maxi motorcycle",
        "desc_lower": "example red carpet premium scuba ultra glam fishtail maxi motorcycle"
    }
]

The code block that throws the error is:

@Override
protected void onMain_ButtonAction(Component c, ActionEvent event) {
int pageNumber = 1;
ConnectionRequest r = new ConnectionRequest();
r.setUrl("http://myIP/query/basic_search/query/motorcycle.json?limit=41");
r.setPost(false);
r.setHttpMethod("GET");
r.setContentType("application/json");
NetworkManager.getInstance().addToQueueAndWait(r);

ByteArrayInputStream allSearchResultsInBytes = new ByteArrayInputStream(r.getResponseData());
String responseInString = null;        
try {
    responseInString = Util.readToString(allSearchResultsInBytes, "UTF-8");
} catch (IOException ex) {
    //Logger.getLogger(StateMachine.class.getName()).log(Level.SEVERE, null, ex);
}
JSONObject allSearchResultsAsJSON = new JSONObject(responseInString);
JSONArray listOfResultIds = allSearchResultsAsJSON.names();

Form wallScreen = c.getComponentForm();
Container myContainerForAllSearchResults = new Container();
Layout myLayout = new BoxLayout(BoxLayout.Y_AXIS);
myContainerForAllSearchResults.setLayout(myLayout);

Integer counter = 0;
while (counter < allSearchResultsAsJSON.length()) {
    String id = listOfResultIds.getString(counter);
    JSONObject oneSearchResultAsJSON = (JSONObject) allSearchResultsAsJSON.get(id);

    Container mySearchResultContainer = new Container();

    String motorcyclePrice = oneSearchResultAsJSON.getString("price");
    String motorcycleDesc  = oneSearchResultAsJSON.getString("description");
    String motorcycleTitle = oneSearchResultAsJSON.getString("title");
    String motorcyclePic   = oneSearchResultAsJSON.getString("pic");

    Label myLabelForPic   = new Label(motorcyclePic);
    Label myLabelForPrice = new Label(motorcyclePrice);
    Label myLabelForTitle = new Label(motorcycleTitle);
    Label myLabelForDesc  = new Label(motorcycleDesc);

    mySearchResultContainer.addComponent(myLabelForPrice);
    mySearchResultContainer.addComponent(myLabelForTitle);
    mySearchResultContainer.addComponent(myLabelForDesc);
    mySearchResultContainer.addComponent(myLabelForPic);

    myContainerForAllSearchResults.addComponent(mySearchResultContainer);

    counter = counter + 1;

}
    wallScreen.addComponent(wallScreen.getComponentCount(), myContainerForAllSearchResults);
    wallScreen.revalidate();

}

使用new JSONArray(responseInString)而不是new JSONObject(responseInString)

Your input string (responseInstring) is a JSON array , not a JSON object per se.

Change this line:

JSONObject allSearchResultsAsJSON = new JSONObject(responseInString);

To be this:

JSONArray allSearchResultsAsJSON = new JSONArray(responseInString);

and use a different way of indexing allSearchResultsAsJSON because the .names method is only for JSONObject not JSONArray.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM