2017-05-05 9 views
-1

APIから2つの可能な出力を得ることができます。私が望むものを選ぶことができます。私のJavaコードで解析し、gmタグでValueを取得する必要があります。 gmタグがない場合は例外をスローし、そこから1つの値を取得すると、私が使用しているライブラリはorg.json、org.apache.commons.configurationです。 Mavenを注入した。例外を投げるなどは単純ですが、単純な解決策がない場合は、もう一方の値にアクセスすることで値が得られます。タグを検索するwhileループを書くだけですJSON/XML parsen in

XML-Stringは次のようになります。

<report sr="28" groups="All groups" subset="All foods" end="0" start="0" total="0"> 
    <foods> 
     <food ndbno="45149194" name="AHOLD, DIET GINGER BEER, UPC: 688267176883" weight="355.0" measure="1.0 BOTTLE"> 
      <nutrients> 
       <nutrient nutrient_id="208" nutrient="Energy" unit="kcal" value="0" gm="0.0"/> 
      </nutrients> 
     </food> 
    </foods> 
</report> 

JSON-文字列は次のようになります。

{ 
    "report": { 
     "sr": "28", 
     "groups": "All groups", 
     "subset": "All foods", 
     "end": 0, 
     "start": 0, 
     "total": 0, 
     "foods": [ 
      { 
       "ndbno": "45149194", 
       "name": "AHOLD, DIET GINGER BEER, UPC: 688267176883", 
       "weight": 355.0, 
       "measure": "1.0 BOTTLE", 
       "nutrients": [ 
        { 
         "nutrient_id": "208", 
         "nutrient": "Energy", 
         "unit": "kcal", 
         "value": "0", 
         "gm": 0.0 
        } 
       ] 
      } 
     ] 
    } 
} 
some1はalternativライブラリを指摘することができればorg.jsonが過度に複雑なようですので、私は、私も幸せになるよりシンプルであるものを使用します

私はちょうどその周りに私の頭をラップすることはできません、私は "gm"の値にアクセスする必要があります、またはそのような値がない場合は例外をスローします。

答えて

0

あなたは、コードの下に試すことができます使用

JSONObject jsonobj = new JSONObject(str); 
JSONArray foodArray = jsonobj.getJSONObject("report").getJSONArray("foods"); 
for(int i = 0;i<foodArray.length();i++){ 
    JSONArray nutrientsArray = foodArray.getJSONObject(i).getJSONArray("nutrients"); 
    for(int j = 0;j<nutrientsArray.length();j++){ 
     JSONObject nutrientObj = nutrientsArray.getJSONObject(j); 
     if(nutrientObj.has("gm")){ 
      System.out.println("do what you want in case it has gm"); 
      //do what you want in case it has gm 
     }else{ 
      //do what you want in case it do not have gm 
      System.out.println("do what you want in case it not gm"); 
     } 
    } 
} 

図書館:XMLの部分についてはorg.json

が、あなたは、単にXML.toJSONObjectを使用してJSONObjectにXMLを変換することができます(XML_TEXT )そして上記のコードをそのまま使用することができます。

1

Gson jsonパーサーを使用し、jsonスタイルを選択します。 Jsonは未来です。その糸はあなたを武器にして多くのことを助けます。 How to get a value from gson object by key

+1

あなたは多分私にどのように短いコード例を与えることができますGsonで値にアクセスしますか? 私はhttps://sites.google.com/site/gson/gson-user-guideを読んでいますが、あまり役に立たないようです – Cnoffel

+0

はい、私の答えが更新され、必要なものがすべてあります。答えの最後の2行を読んでください。 – strash

0

私は仕事のための簡単なアプローチのように提案することができます。 XMLスキーマで同じデータを使用するには

import org.json.simple.*; 
    ... 

    String fileDictName = ".."; 
    ... 
    JSONParser parser = new JSONParser(); 
      try { 

       Object obj = parser.parse(new FileReader(fileDictName)); 
       JSONArray cons = (JSONArray) obj; 
       Iterator<JSONObject> itCons = cons.iterator(); 
       while (itCons.hasNext()) { 
        JSONObject cp = (JSONObject) itCons.next(); 
        if (cp.containsKey("T")) { 
         JSONArray tbl1 = (JSONArray) cp.get("T"); 
         boolean first = true; 
         Iterator<String> ittbl = tbl1.iterator(); 
         while (ittbl.hasNext()) { 
          String str = ittbl.next(); 
          if (first) { 
..        inttabl++; 
           first = false; 
          } else { 
           ... 
          } 
         } 
        } 

        if (cp.containsKey("C")) { 
         JSONArray cons1 = (JSONArray) cp.get("C"); 
         boolean first = true; 
         Iterator<String> itCons1 = cons1.iterator(); 
         while (itCons1.hasNext()) { 
          String str = itCons1.next(); 
          if (first) { 
    ... 
           intkeywords++; 
           first = false; 
          } else { 
    ... 
          } 
         } 
        } 

       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

:あなたが条件if (cp.containsKey("C"))で必要なタグを確認することができますパースのコードで

[{"T":["",""]}, 
{"C":["asdg","1"]}, 
{"C":["asdgdfgf","2"]} 
] 

-<dictionary>  
-<typeof> 
    <tname id="0">sdfas|dfdfd</tname> 
    </typeof> 

-<concept id="0">  
<con_name>asdg</con_name>  
<subjectOf>dfdfd</subjectOf>  
</concept>  
-<concept id="1">  
<con_name>asdgdfgf</con_name>  
<objectOf>dfdfd</objectOf>  
</concept> 
</dictionary> 
JSONスキームの例

のように使用できます。

import org.xml.sax.*; 
... 
     try { 
       SAXParserFactory factory = SAXParserFactory.newInstance(); 
       SAXParser saxParser = factory.newSAXParser(); 

       DefaultHandler handler = new DefaultHandler() { 

        boolean bdictionary = false; 
        boolean btypeof = false; 
... 

        @Override 
        public void startElement(String uri, String localName, String qName, 
          Attributes attributes) throws SAXException { 

         // System.out.println("Start Element :" + qName); 
         sV = qName; 

         if (qName.equalsIgnoreCase("dictionary")) { 
          bdictionary = true; 
         } 

         if (qName.equalsIgnoreCase("typeof")) { 
          btypeof = true; 
         } 

         if (qName.equalsIgnoreCase("tname")) { 
          btname = true; 
         } 

         if (qName.equalsIgnoreCase("concept")) { 
          bconcept = true; 
         } 

         if (qName.equalsIgnoreCase("con_name")) { 
          bcon_name = true; 
         } 

         if (qName.startsWith("subjectOf")) { 
          bsubjectof = true; 
         } 
         if (qName.startsWith("objectOf")) { 
          bobjectof = true; 
         } 

        } 

        @Override 
        public void endElement(String uri, String localName, 
          String qName) throws SAXException { 
         //System.out.println("End Element :" + qName); 
        } 

        public void saveTuple(String strT) { 
     ... 
        } 

        public void saveKeyw(String strT) { 
..       
} 


... 


        @Override 
        public void characters(char ch[], int start, int length) throws SAXException { 

         if (bdictionary) { 
          // System.out.println("dictionary : " + new String(ch, start, length)); 
          bdictionary = false; 
         } 

         if (btypeof) { 
          // System.out.println("id : " + new String(ch, start, length)); 
          btypeof = false; 
         } 

... 

        } 

       }; 
       saxParser.parse(fileDictName, handler); 
      } catch (ParserConfigurationException | SAXException | IOException e) { 
      } 

     } else { 
... 
     } 
あなたのJSON文字列の場合
+0

それでは、正確に何をしていますか? Valueにアクセスしたいのですが、なぜ私はaddRowsかsetValuesを必要としますか?私は既にInputStreamReader + URLからJSON Stringを取得しています – Cnoffel

+1

使いやすい1つの例を示します。あなたのソフトのためにそれを適応させることができます。あなたは、何かをaddRowsする必要はありません。私はあなたに働くための主要な構造を見せようとしています –

0

私は単純な$ .report.foods [0] .nutrients [0]でjsonパスライブラリを使います。GMは、あなたはここでしか例について

https://github.com/json-path/JsonPath

簡単な(あなたはもちろん、より複雑なニーズに基づいてパスを使用することができます)GM要素と少なくとも一つの栄養素を有する少なくとも一つの食べ物がありますかどうかを確認する必要がある場合例

String json = "{yor json here}"; 
Object document = 
Configuration.defaultConfiguration().jsonProvider().parse(json); 

String gmValue = JsonPath.read(document, "$.report.foods[0].nutrients[0].gm"); 

あなたはパスが存在しないか、何でもない場合に例外を取得する場合、私は覚えていないが、それは自分でテストすることは非常に簡単です