JSONObject不从QR码获取数据

时间:2018-03-09 05:46:14

标签: java android json

当我扫描二维码时,它会在result.getContents上获取数据但是没有传递JSONObject上的数据obj只是指示继续Catch阻止

数据传递到此行JSONObject obj = new JSONObject(result.getContents());但是当开始Debug时,它不会传递' obj'在上面的行。

这是我的代码:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {
            //if qrcode has nothing in it
            if (result.getContents() == null) {
                Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show();
            } else {
                //if qr contains data
                try {
                    //converting the data to json
                    JSONObject obj = new JSONObject(result.getContents());
                    //setting values to textviews

                    if(obj.has("FN")) {
                        etFirstName.setText(obj.getString("FN"));
                    }
                    if(obj.has("N")) {
                        etLastName.setText(obj.getString("LN"));
                    }
                    if(obj.has("TITLE")) {
                        etTitle.setText(obj.getString("TITLE"));
                    }
                    if(obj.has("STATUS")) {
                        etStatus.setText(obj.getString("STATUS"));
                    }
                    if(obj.has("EMAIL")) {
                        etEmail.setText(obj.getString("EMAIL"));
                    }
                    if(obj.has("TEL;TYPE=work")) {
                        etPhoneHome.setText(obj.getString("TEL;TYPE=work"));
                    }
                    if(obj.has("TEL;TYPE=cell")) {
                        etPhonePrimary.setText(obj.getString("TEL;TYPE=cell"));
                    }
                    if(obj.has("ADR;TYPE=work")) {
                        etAddressLine1.setText(obj.getString("ADR;TYPE=work"));
                    }
                    if(obj.has("Street")) {
                        etAddressLine2.setText(obj.getString("Street"));
                    }
                    if(obj.has("Street")) {
                        etCity.setText(obj.getString("Street"));
                    }
                    if(obj.has("zip")) {
                        etZip.setText(obj.getString("zip"));
                    }


                } catch (JSONException e) {

                    Log.e(TAG, "notification= error" + e.toString());
                    e.printStackTrace();

                    /*etFirstName.setText(result.getContents());
                    etLastName.setText(result.getContents());
                    etTitle.setText(result.getContents());
                    etEmail.setText(result.getContents());*/
                    //if control comes here
                    //that means the encoded format not matches
                    //in this case you can display whatever data is available on the qrcode
                    //to a toast
                    Toast.makeText(this, result.getContents(), Toast.LENGTH_LONG).show();
                }
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

Logcat见下文:

03-09 11:23:06.909 297-678/? E/SimpleSoftOMXComponent: 3
03-09 11:23:07.127 297-665/? E/audio_a2dp_hw: adev_set_parameters: ERROR: set param called even when stream out is null
03-09 11:23:12.899 26980-26980/com.example.crm E/AddContactActivity: notification= errororg.json.JSONException: Value BEGIN of type java.lang.String cannot be converted to JSONObject
03-09 11:23:13.040 297-8371/? E/SimpleSoftOMXComponent: 1
03-09 11:23:13.040 297-8371/? E/SimpleSoftOMXComponent: 2
03-09 11:23:13.041 297-8371/? E/SimpleSoftOMXComponent: 3

JSON响应数据如下代码:

BEGIN:VCARD,
VERSION:2.1
FN:sss sss
N:sss;sss
TITLE:PHD
TEL;CELL:1111111111
TEL;WORK;VOICE:2222222222
TEL;HOME;VOICE:8888888888
EMAIL;HOME;INTERNET:abc@example.com
EMAIL;WORK;INTERNET:abc@example.com
URL:http://ABC@ABC.COM
ADR:;;sample address;ss;;102103;US
ORG:ss
END:VCARD

到处搜索,但我没有得到任何关于此问题的结果,所以plzzz帮助我:)

感谢和安培;问候 Sandeep Patel

4 个答案:

答案 0 :(得分:2)

这是我的解决方案。         如果你得到像

这样的回复数据
        "
        BEGIN:VCARD,
        VERSION:2.1
        FN:sss sss
        N:sss;sss
        TITLE:PHD
        TEL;CELL:1111111111
        TEL;WORK;VOICE:2222222222
        TEL;HOME;VOICE:8888888888
        EMAIL;HOME;INTERNET:abc@example.com
        EMAIL;WORK;INTERNET:abc@example.com
        URL:http://ABC@ABC.COM
        ADR:;;sample address;ss;;102103;US
        ORG:ss
        END:VCARD
        " this than forgot the json object concept.

使用vcard库。你可以从这里获得vcard库              https://github.com/mangstadt/ez-vcard

通过使用此库,您可以使用下面的代码获取所需的任何联系人数据,并且可以在editext.

中进行设置
String str =
    "BEGIN:VCARD\r\n" +
    "VERSION:4.0\r\n" +
    "N:Doe;Jonathan;;Mr;\r\n" +
    "FN:John Doe\r\n" +
    "END:VCARD\r\n";`

        VCard vcard = Ezvcard.parse(str).first();
        String fullName = vcard.getFormattedName().getValue();
        String lastName = vcard.getStructuredName().getFamily();

如果您对如何做到这一点有任何疑问仍然存在。你可以进一步问我。

答案 1 :(得分:2)

您的数据不是JSON,请查看输出中的JSONLint reportserrororg.json.JSONException通知您,在字符串的开头,Json中不允许使用短语“BEGIN”。

{
    "json": "looks like this",
    "key": "value"
}

由于您的数据似乎是vCard,因此您需要一个不同的解析库,例如https://github.com/mangstadt/ez-vcard

String str =
"BEGIN:VCARD\r\n" +
"VERSION:4.0\r\n" +
"N:Doe;Jonathan;;Mr;\r\n" +
"FN:John Doe\r\n" +
"END:VCARD\r\n";

VCard vcard = Ezvcard.parse(str).first();
String fullName = vcard.getFormattedName().getValue();
String lastName = vcard.getStructuredName().getFamily();

所以在您的代码段中:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (result != null) {
        //if qrcode has nothing in it
        if (result.getContents() == null) {
            Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show();
        } else {
            //if qr contains data
            try {
                //converting the data to vCard object
                VCard vcard = Ezvcard.parse(result.getContents()).first();
                //setting values to textviews

                // "given name" is the first name
                etFirstName.setText(vcard.getStructuredName().getGiven());

                // "family name" is the last name
                etLastName.setText(vcard.getStructuredName().getFamily());
                ...

答案 2 :(得分:0)

检查字符串数据。 确保您的String数据是json对象。

在日志中打印你的字符串并检查它是否是json。

答案 3 :(得分:0)

内容不是JSON,因此您无法将其转换为JSONObject。 您可能需要Vcard的解析器。在Github中搜索一些图书馆或自己编写。