JavaScript:无法解析json,错误为意外标记

JavaScript:无法解析json,错误为意外标记,javascript,java,json,Javascript,Java,Json,我以前设法用java代码解析json url,但现在需要将其迁移到javascript。当我使用JavaScript解析时,syntaxerror:出现了意外的标记 SyntaxError: Unexpected token i in JSON at position 2 at JSON.parse (<anonymous>) at success (homeCtrl.js:1060) at processQueue (ionic.bundle.js:29127) at ionic.

我以前设法用java代码解析json url,但现在需要将其迁移到javascript。当我使用JavaScript解析时,syntaxerror:出现了意外的标记

SyntaxError: Unexpected token i in JSON at position 2
at JSON.parse (<anonymous>)
at success (homeCtrl.js:1060)
at processQueue (ionic.bundle.js:29127)
at ionic.bundle.js:29143
at Scope.$eval (ionic.bundle.js:30395)
at Scope.$digest (ionic.bundle.js:30211)
at Scope.$apply (ionic.bundle.js:30503)
at done (ionic.bundle.js:24824)
at completeRequest (ionic.bundle.js:25022)
at XMLHttpRequest.requestLoaded (ionic.bundle.js:24963)
(anonymous) @ ionic.bundle.js:26794
(anonymous) @ ionic.bundle.js:23507
processQueue @ ionic.bundle.js:29135
(anonymous) @ ionic.bundle.js:29143
$eval @ ionic.bundle.js:30395
$digest @ ionic.bundle.js:30211
$apply @ ionic.bundle.js:30503
done @ ionic.bundle.js:24824
completeRequest @ ionic.bundle.js:25022
requestLoaded @ ionic.bundle.js:24963 
java代码可以正确解析同一url,没有错误

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new AsyncTas().execute();
    }

    private class AsyncTas extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... voids) {
            HttpURLConnection urlConnection = null;
            String urlString = "http://www.sgx.com/JsonRead/JsonData?qryId=RStock&timeout=30";
            try {
                urlConnection = (HttpURLConnection) new URL(urlString).openConnection();
                //String result = readIt(new BufferedInputStream(urlConnection.getInputStream()));
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(urlConnection.getInputStream()));

                // Grab the results
                StringBuilder log = new StringBuilder();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    log.append(line + "\n");
                }
                String result = log.toString();

                result = result.substring(result.indexOf("&&") + 2);
                JSONObject jo = new JSONObject(result);

                Log.e(TAG, "doInBackground: "+result);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(),"Unable to parse json "+e.getMessage(),Toast.LENGTH_LONG).show();
            }
            return null;
        }
    }
}

请改用eval。您的json数据不是严格模式。严格模式json数据密钥必须双引号

演示
var json=“{}&&{identifier:'ID'}”;
函数测试(json、解析器){
试一试{
log(“通过“+parser.name+”=>“+JSON.stringify(parser(“+JSON+”)”)进行解析);
}捕获(e){
console.log('不能由'+parser.name'解析);
}
}
测试(json,json.parse);

测试(json,eval)源数据似乎不包含有效的JSON数据。根据定义,键是字符串,因此必须用双引号括起来,这也适用于字符串值:

{ "identifier": "ID" }
正如错误所述,解析器期望的是双引号,而不是i字符


我建议您先用一个小片段测试代码,以验证它是否能与有效的JSON数据一起工作。

Eval()不应用于JSON解析,这是出于安全和效率的原因@BjörnM eval存在安全问题,但您可以将其封装为不允许访问只有全局变量才能访问的其他变量。在我看来,简单地修复输入比复杂的遗留解决方案更可靠。据我所知,提问者正在创建JSON,因此有可能在婴儿掉入井内之前修复它,而不是事后将其取出。如果没有出路,您的解决方案将解决遗留解析问题。因为Java不需要严格模式JSON:这就是JSON.parse和eval()之间的区别。第一个需要严格的JSON,另一个需要JavaScript。您可以使用最后一种格式写入源数据。请参阅@BjörnM,您可以建议的任何解决方法吗?ThanksI think@holi java在他的回答中指出,在我看来,修复输入,即严格使用JSON,是最简单的解决方案。
{identifier:'ID', label:'As at 08-03-2017 2:48 PM',items:[{ID:0,N:'3Cnergy',SIP:'',NC:'502',R:'',I:'',M:'t',LT:0.000,C:0.000,VL:0.000,BV:100.000,B:'0.042',S:'0.047',SV:70.000,O:0.000,H:0.000,L:0.000,V:0.000,SC:'2',PV:0.040,PTD:'20170307',BL:'100',EX:'',EJ:'',CLO:'',P:0.0,P_:'X',V_:''},{ID:1,N:'800 Super',SIP:'',NC:'5TG',R:'',I:'',M:'t',LT:1.160,C:-0.020,VL:51.400,BV:10.500,B:'1.160',S:'1.170',SV:10.000,O:1.180,H:1.180,L:1.160,V:60324.500,SC:'A',PV:1.180,PTD:'20170307',BL:'100',EX:'',EJ:'',CLO:'',P:-1.694915234375,P_:'X',V_:''},{ID:2,N:'8Telecom',SIP:'',NC:'AZG',R:'',I:'',M:'',LT:0.000,C:0.000,VL:0.000,BV:5.000,B:'0.130',S:'0.140',SV:10.000,O:0.000,H:0.000,L:0.000,V:0.000,SC:'2',PV:0.135,PTD:'20170306',BL:'100',EX:'',EJ:'',CLO:'',P:0.0,P_:'X',V_:''},{ID:3,N:'A-Smart',SIP:'',NC:'BQC',R:'',I:'',M:'',LT:0.570,C:-0.020,VL:60.000,BV:31.000,B:'0.570',S:'0.580',SV:10.000,O:0.575,H:0.575,L:0.570,V:34350.000,SC:'2',PV:0.590,PTD:'20170307',BL:'100',EX:'',EJ:'',CLO:'',P:-3.38983046875,P_:'X',V_:''}, 
{ "identifier": "ID" }