2016-03-12 3 views
2

Я использую Java с плагином для NetBeans, называемым CODAPPS, для извлечения, анализа и отображения данных JSON.Чтение данных JSON, которое начинается с [и заканчивается на]

Я следую примеру использования данных JSON, созданных в базе данных Firebase от Google, но вместо этого я использую SlashDB.

По какой-то причине данные JSON от SlashDB начинаются и заканчиваются [ и ], соответственно.

я получаю следующее сообщение об ошибке:

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) 

Мои данные JSON выглядит следующим образом:

[ 
    { 
     "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" 
    } 
] 

Блок кода, который бросает ошибку является:

@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(); 

} 

ответ

7

Использование new JSONArray(responseInString) вместо от new JSONObject(responseInString).

+0

Отлично, есть ли способ получить индекс результатов такого массива, как я делал с методом '.names()' JSONObject? –

+0

Я думаю, что это ответ на мой вопрос в комментарии выше http://stackoverflow.com/questions/7634518/getting-jsonobject-from-jsonarray –

3

Ваша входная строка (responseInstring) представляет собой массив JSON , а не JSON объект по себе.

Изменить эту строку:

JSONObject allSearchResultsAsJSON = new JSONObject(responseInString); 

Для этого:

JSONArray allSearchResultsAsJSON = new JSONArray(responseInString); 

и использовать другой способ индексации allSearchResultsAsJSON, так как метод .names только для JSONObject не JSONArray.

Смежные вопросы