Parse JSON object in SAS macro

前端 未结 3 1327
梦毁少年i
梦毁少年i 2020-12-06 23:53

Here is the input JSON file. It have to parse in SAS dataset.

\"results\":
[
 {
    \"acct_nbr\": 1234,
    \"firstName\": \"John\",
    \"lastName\": \"Smit         


        
3条回答
  •  粉色の甜心
    2020-12-07 00:46

    I used this json file and above code as an example in a thread on sas.com. One of the expert programmers on there was extremely generous and came up with a solution. Note the json file should be wrapped in "{}".

    Link: https://communities.sas.com/thread/72163

    Code:

    filename cp temp;
    proc groovy classpath=cp;
    
    
    add classpath="C:\Program Files\Java\groovy-2.3.4\embeddable\groovy-all-2.3.4.jar";
    /*or*/
    /*
    add classpath="C:\Program Files\Java\groovy-2.3.4\lib\groovy-2.3.4.jar";
    add classpath="C:\Program Files\Java\groovy-2.3.4\lib\groovy-json-2.3.4.jar";
    */
    
    submit parseonly;
    import groovy.json.JsonSlurper
    class MyJsonParser {
        def parseFile(path) {
         def jsonFile = new File(path)
      def jsonText = jsonFile.getText()
            def InputJSON = new JsonSlurper().parseText(jsonText)
            def accounts = []
    
    
            InputJSON.results.each{
                accounts << [
                        acct_nbr      : it.acct_nbr.toString(),
                        firstName     : it.firstName,
                        lastName      : it.lastName,
                        age           : it.age.toString(),
                        streetAddress : it.address.streetAddress,
                        city          : it.address.city,
                        state         : it.address.state,
                        postalCode    : it.address.postalCode
                ]
            }
    
    
            return accounts
        }
    }
    endsubmit;
    
    
    submit parseonly;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    
    
    public class MyJsonParser4Sas {
        public String filename = "";
    
    
        public void init() {
            MyJsonParser myParser = new MyJsonParser();
            accounts = myParser.parseFile(filename);
            iter = accounts.iterator();
        }
    
    
        public boolean hasNext() {
            return iter.hasNext();
        }
    
    
        public void getNext() {
            account = ((LinkedHashMap) (iter.next()));
        }
    
    
        public String getString(String k) {
            return account.get(k);
        }
    
    
        protected ArrayList accounts;
        protected Iterator iter;
        protected LinkedHashMap account;
    }
    endsubmit;
    
    
    quit;
    
    
    options set=classpath "%sysfunc(pathname(cp,f))";
    
    data accounts;
       attrib id            label="Account Index"  length=    8
              acct_nbr      label="Account Number" length=$  10
              firstName     label="First Name"     length=$  20
              lastName      label="Last Name"      length=$  30
              age           label="Age"            length=$   3
              streetAddress label="Street Address" length=$ 128
              city          label="City"           length=$  40
              state         label="State"          length=$   2
              postalCode    label="Postal Code"    length=$   5;
    
    
       dcl javaobj accounts("MyJsonParser4Sas");
       accounts.exceptiondescribe(1);
    
    
       accounts.setStringField("filename", "C:\\foo.json");
    
    
       accounts.callVoidMethod("init");
    
    
       accounts.callBooleanMethod("hasNext",rc);
       do id=1 by 1 while(rc);
          accounts.callVoidMethod("getNext");
       accounts.callStringMethod("getString", "acct_nbr", acct_nbr);
       accounts.callStringMethod("getString", "firstName", firstName);
       accounts.callStringMethod("getString", "lastName", lastName);
       accounts.callStringMethod("getString", "age", age);
       accounts.callStringMethod("getString", "streetAddress", streetAddress);
       accounts.callStringMethod("getString", "city", city);
       accounts.callStringMethod("getString", "state", state);
       accounts.callStringMethod("getString", "postalCode", postalCode);
          output;
       accounts.callBooleanMethod("hasNext",rc);
       end;
    
       drop rc;
    run;
    

提交回复
热议问题