如何使用Json字符串?

时间:2012-12-30 03:43:16

标签: android asp.net json web-services

以下是尝试返回JSON字符串的asp Web服务输出(不确定它是否返回JSON字符串)。

enter image description here

在android应用程序使用之后,字符串如下:

GetCustomerListResponse {GetCustomerListResult = [{ “VehicleID”: “KL-9876”, “VehicleType”: “日产”, “VehicleOwner”: “Sanjiva”}];}

[我很确定它不是json字符串]。

我想知道我应该做些什么更改,以便android程序使用json字符串。

非常感谢,我的完整aspx代码和android代码如下所示。

ANDROID CODE:

    package com.example.objectpass;


        import android.app.Activity;
        import android.os.Bundle;
        import android.util.Log;
        import android.widget.ArrayAdapter;
        import android.widget.Spinner;
        import android.widget.TextView;

        import org.json.JSONArray;
        import org.json.JSONObject;
        import org.ksoap2.*;
        import org.ksoap2.serialization.SoapObject;
        import org.ksoap2.serialization.SoapPrimitive;
        import org.ksoap2.serialization.SoapSerializationEnvelope;
        import org.ksoap2.transport.*;

        public class MainActivity extends Activity {
            TextView resultA;
            Spinner spinnerC;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                String[] toSpinnerSum;
                toSpinnerSum = new String[9];

                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                spinnerC = (Spinner) findViewById(R.id.spinner1);
                resultA = (TextView) findViewById(R.id.textView2);

                final String NAMESPACE = "http://tempuri.org/";
                final String METHOD_NAME = "GetCustomerList";
                final String SOAP_ACTION = "http://tempuri.org/GetCustomerList";
                final String URL = "http://192.168.1.100/WebService4/Service1.asmx";

                SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
                SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
                soapEnvelope.dotNet = true;
                soapEnvelope.setOutputSoapObject(Request);
                AndroidHttpTransport aht = new AndroidHttpTransport(URL);



                try {
                    aht.call(SOAP_ACTION, soapEnvelope);
                    SoapObject response = (SoapObject) soapEnvelope.bodyIn;

                    JSONArray jArray = new JSONArray();

                    resultA.setText(response.toString());

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

ASP WEB服务代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using Newtonsoft.Json;

namespace WebService4
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
       [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetCustomerList()
        {
            Vehicle vehi = simpleCase();
            List<Vehicle> newL = new List<Vehicle> { vehi };
            string output = JsonConvert.SerializeObject(newL);
           // return newL;
            return output;
        }




        [WebMethod]
        public Vehicle simpleCase()
        {
            Vehicle obj = new Vehicle();
            obj.VehicleID = "KL-9876";
            obj.VehicleType = "Nissan";
            obj.VehicleOwner = "Sanjiva";
            return obj;
        }
    }



    public class Vehicle
    {
        public string VehicleID { get; set; }
        public string VehicleType { get; set; }
        public string VehicleOwner { get; set; }
    }

}

2 个答案:

答案 0 :(得分:1)

您的WCF服务是XML和JSON的混合体。您需要将其更改为返回纯JSON的服务。

然后,您可以使用网址http://localhost:49476/JsonService.svc/vehiclelisthttp://localhost:49476/JsonService.svc/randomvehicle访问您的JSON方法(在您的情况下,端口号将不同)。只需在您的网络浏览器中试用即可。

您可能还想查看此answer。除了这个答案,它还展示了如何使用POST请求向服务发送大量数据。

请注意,我不为WCF服务使用任何JSON类。相反,W

<强> IJsonService.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace SimpleJsonService
{
    [ServiceContract]
    public interface IJsonService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Bare,
           UriTemplate = "/vehiclelist")]
        List<Vehicle> GetCustomerList();

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Bare,
           UriTemplate = "/randomvehicle")]
        Vehicle RandomVehicle();
    }


    [DataContract]
    public class Vehicle
    {
        [DataMember]
        public string VehicleID { get; set; }
        [DataMember]
        public string VehicleType { get; set; }
        [DataMember]
        public string VehicleOwner { get; set; }
    }
}

<强> JsonService.svc.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace SimpleJsonService
{
    public class JsonService : IJsonService
    {
        public List<Vehicle> GetCustomerList()
        {
            Vehicle vehicle = RandomVehicle();
            List<Vehicle> vehicleList = new List<Vehicle> { vehicle };
            return vehicleList;
        }

        public Vehicle RandomVehicle()
        {
            Vehicle vehicle = new Vehicle();
            vehicle.VehicleID = "KL-9876";
            vehicle.VehicleType = "Nissan";
            vehicle.VehicleOwner = "Sanjiva";
            return vehicle;
        }
    }
}

<强> JsonService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="SimpleJsonService.JsonService" CodeBehind="JsonService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

<强>的Web.config:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

在Android方面,您将需要使用HTTPClient和JSONObject / JSONArray来检索数据并解析它。 StackOverflow上有很多示例说明如何操作。

答案 1 :(得分:1)

嗨@Kasanova将服务的响应格式设为json,如bellow:

 [OperationContract]
 [WebGet(UriTemplate = "data/id={value}", ResponseFormat = WebMessageFormat.Json)]
 string[] GetUser(string Id);