如何从响应中仅获取JSON

时间:2017-04-29 07:03:10

标签: android api soap response android-ksoap2

我使用SOAP方法调用API。 用于快速轻松地将XML转换为JSON的任何工具。

这是我的回复。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <getOperator_AllResponse xmlns="http://tempuri.org/">
            <getOperator_AllResult>[{"OperatorId":7,"OperatorName":"Aircel"},{"OperatorId":8,"OperatorName":"Airtel"},{"OperatorId":11,"OperatorName":"Bsnl"},{"OperatorId":14,"OperatorName":"Idea"},{"OperatorId":15,"OperatorName":"Loop Mobile"},{"OperatorId":16,"OperatorName":"Mtnl"},{"OperatorId":17,"OperatorName":"Mts"},{"OperatorId":22,"OperatorName":"Reliance Cdma"},{"OperatorId":23,"OperatorName":"Reliance Gsm"},{"OperatorId":24,"OperatorName":"T24"},{"OperatorId":25,"OperatorName":"Tata Docomo"},{"OperatorId":27,"OperatorName":"Tata_Ttsl"},{"OperatorId":28,"OperatorName":"Tata_Walky"},{"OperatorId":29,"OperatorName":"Uninor"},{"OperatorId":30,"OperatorName":"Videocon"},{"OperatorId":32,"OperatorName":"Virgin Cdma"},{"OperatorId":33,"OperatorName":"Virgin Gsm"},{"OperatorId":34,"OperatorName":"Vodafone"}]</getOperator_AllResult>
        </getOperator_AllResponse>
    </soap:Body>
</soap:Envelope>

我需要唯一的JSON。

[{"OperatorId":7,"OperatorName":"Aircel"},{"OperatorId":8,"OperatorName":"Airtel"},{"OperatorId":11,"OperatorName":"Bsnl"},{"OperatorId":14,"OperatorName":"Idea"},{"OperatorId":15,"OperatorName":"Loop Mobile"},{"OperatorId":16,"OperatorName":"Mtnl"},{"OperatorId":17,"OperatorName":"Mts"},{"OperatorId":22,"OperatorName":"Reliance Cdma"},{"OperatorId":23,"OperatorName":"Reliance Gsm"},{"OperatorId":24,"OperatorName":"T24"},{"OperatorId":25,"OperatorName":"Tata Docomo"},{"OperatorId":27,"OperatorName":"Tata_Ttsl"},{"OperatorId":28,"OperatorName":"Tata_Walky"},{"OperatorId":29,"OperatorName":"Uninor"},{"OperatorId":30,"OperatorName":"Videocon"},{"OperatorId":32,"OperatorName":"Virgin Cdma"},{"OperatorId":33,"OperatorName":"Virgin Gsm"},{"OperatorId":34,"OperatorName":"Vodafone"}]

我尝试过这段代码但没有得到回应。

 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("iType", 0);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        envelope.dotNet = true;
        envelope.implicitTypes = true;
        String responseDump = "";
        try {

            HttpTransportSE ht = new HttpTransportSE(URL);
            ht.call(SOAP_ACTION, envelope);
            ht.debug = true;
            ht.setTimeout(300000);

            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
            SoapObject result = (SoapObject) envelope.bodyIn;

            Debug.e("Resp1", "--" + response.toString());
            Debug.e("Resp2", "--" + result.toString());


        } catch (Exception e) {
            Debug.e("Exception", "--" + e.getMessage());
            e.printStackTrace();
        }

得到以下错误

java.net.SocketTimeoutException
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:130)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at com.multilink.fragment.MobileRechargeFragment.onCreateView(MobileRechargeFragment.java:116)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:2189)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1979)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
04-29 12:27:11.686 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.View.measure(View.java:17547)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.Choreographer.doCallbacks(Choreographer.java:580)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.Choreographer.doFrame(Choreographer.java:550)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.os.Looper.loop(Looper.java:135)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5254)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
04-29 12:27:11.687 1440-1440/com.multilink W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

请帮帮我。 在此先感谢。)

1 个答案:

答案 0 :(得分:0)

我之前没有使用过工具将Xml转换为json,但在你的情况下,我觉得很简单。您可以编写一个将您的响应拆分为仅保留JSON响应的类。

如果不是,只需将响应转换为字符串,然后在这两个点<getOperator_AllResult></getOperator_AllResult>处拆分字符串。这是隔离JSON响应的最简单方法。

让我们继续将上面的回复拆分为json。

//Split response at <getOperator_AllResult> as first split point.

String j[] = yourResponse.split("<getOperator_AllResult>");

//get the value of the rest of the string from your split(1)

String json1 = j[1];

//Split the newly stored value json1, at the next point 

// </getOperator_AllResult>

String j2[] = json1.split("</getOperator_AllResult>");

//finally get initial value of the second split, and this is your Json

String json = j2[0];
System.out.println("Json Value " + json);

使用此解决方案的缺点是我们假设所有响应都将使用这些标记<getOperator_AllResult></getOperator_AllResult>包含在内,与上述问题中的响应相同。