Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

web service that returns JSON string

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 01-02-2011, 18:18. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  31-01-2011, 15:16 62853

    web service that returns JSON string

    Καλημέρα,
    Πρέπει να φτιάξω ένα Σervice το οποίο θα κάνει ερώτηση στην βάση δεδομένων και η επιστροφή του ερωτήματος θα δημιουργεί ένα DataTable. Αυτό το datatable τώρα θα πρέπει να το κάνω parse σε JSON. Το service αυτό θα χρησιμοποείται απο Java applet και android mobile. Μπορεί να γίνει αυτό;

    Ευχαριστώ εκ των προτέρων.
  •  31-01-2011, 15:45 62854 σε απάντηση της 62853

    Απ: web service that returns JSON string

    Μπορείς να δημιουργήσεις WCF Service το οποίο επιστρέφει JSON. Θα πρέπει όμως να αλλάξεις τον τύπο των δεδομένων σε κάτι πέρα από DataTable, π.χ. σε List<Customer>. Μετά, απλά αλλάζεις το Request/ResponseFormat των μεθόδων σου σε JSON. Δες και αυτή την ερώτηση στο StackOverflow που απαντάει ακριβώς σε αυτό που ρωτάς.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-01-2011, 18:17 62857 σε απάντηση της 62854

    Απ: web service that returns JSON string

    Ουπς, λείπει και κάτι ακόμα. Πρέπει στο config του WCF service σου να ορίσεις και ένα WebHttpBinding endpoint για να μπορεί να το καλέσει κώδικας από javascript. Για παράδειγμα, έφτιαξα ένα χαζό service σε WCF 4 το οποίο λέγεται ... Service1 και χρειάστηκε να προσθέσω το παρακάτω XML μέσα στο <system.serviceModel>
    	  <services>
    		  <service name="WcfJsonTest.Service1">
    			  <endpoint address="" behaviorConfiguration="WcfJsonTest.TestServiceBehavior" binding="webHttpBinding" contract="WcfJsonTest.IService1">
    			  </endpoint>
    		  </service>
    	  </services>


    και το παρακάτω στο <behaviors>

    		  <endpointBehaviors>
    			  <behavior name="WcfJsonTest.TestServiceBehavior">
    				  <webHttp helpEnabled="true"/>
    			  </behavior>
    		  </endpointBehaviors>

    Το helpEnabled ενεργοποιεί μία help σελίδα στο Service1.svc/help η οποία εμφανίζει όλες τις μεθόδους του service μου και το URL που πρέπει να φτιάξω για να το καλέσω

    Το λαμπρό αποτέλεσμα είναι παρακάτω:

    [{"BoolValue":true,"StringValue":"Moo"},{"BoolValue":false,"StringValue":"Moo1"}]

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-01-2011, 21:35 62864 σε απάντηση της 62857

    Απ: web service that returns JSON string

    ευχαριστώ για την απάντηση. Θα πρέπει να αρχίσω το ψάξιμο με WCF γιατί είμαι ακόμα στην αρχή. Αυτό που θέλω γενικά να κάνω είναι να δημιουργήσω 3 services που επιστρέφουν δεδομένα απο SQL server. Μόνο για ανάγνωση θα είναι αυτά τα δεδομένα.

    ευχαριστώ και πάλι.
  •  31-01-2011, 23:35 62875 σε απάντηση της 62864

    Απ: web service that returns JSON string

    Τότε αξίζει να κοιτάξεις τα WCF Data Services. Εμφανίζουν με πολύ απλό τρόπο τα περιεχόμενα ενός μοντέλου Entity Framework ως REST είτε σε μορφή Atom Feed είτε JSON και επιτρέπουν τη δημιουργία queries (κομπλέ με selects, paging, sorting) μέσω του URL, της Javascript ή ακόμα και LINQ αν η εφαρμογή σου είναι .NET. Δες αυτό το άρθρο στο MSDN Magazine για το πως μπορεί κανείς να καλέσει ένα WCF Data Service μέσω του ASP.NET Ajax library και αυτό το άρθρο του Shawn Wildermuth για το πως να το καλέσει μέσω jQuery και να πάρει πίσω JSON. Για να πάρεις JSON το μόνο που χρειάζεται είναι να βάλεις τα σωστά HTTP Header στο request (contentType: "application/json; charset=utf-8",  dataType: "json")

    Όσο για το πως φτιάχνεις ένα WCF Data Service, στην απλούστερη μορφή του είναι απλά το παρακάτω:

    public class NorthwindService : DataService<NorthwindEntities>
    {
       public static void InitializeService(IDataServiceConfiguration config)
       {
          config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
        }
    }
    όπου NorthwindEntities είναι το context που δημιουργεί το EF και Customers το όνομα της κλάσης (του EntitySet για την ακρίβεια) που θέλεις να βγάλεις προς τα έξω

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-02-2011, 10:49 62879 σε απάντηση της 62875

    Απ: web service that returns JSON string

    μάλλον θα μείνω προσωρινά με τα web services, γιατί απο ότι καταλαβαίνω θέλει αρκετό χρόνο, και επειδή για αρχή θα πρέπει να λειτουργεί κάποιο service πιλοτικά. Λοιπόν έχω την παρακάτω web method
     <WebMethod()> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
        Public Function getAllCustomers() As String
            Using myConnection As New SqlConnection("Data Source=.\sqlexpress;Initial Catalog=DBName;Integrated Security=True;User ID=sa;Password=;")
                If myConnection.State = ConnectionState.Closed Then
                    myConnection.Open()
                End If
    
                Dim DRAllData As SqlDataReader
                Dim myCommand As New SqlCommand
                myCommand.Connection = myConnection
                myCommand.CommandType = CommandType.Text
    
                Try
                    myCommand.CommandText = "Select Top 10 CustomerID,FName,LName From Customers"
                    DRAllData = myCommand.ExecuteReader
    
                    Dim DTAllData As New DataTable
                    DTAllData.Load(DRAllData)
    
                    Return ConvertJSON.GetJSONString(DTAllData)
                Catch ex As Exception
                    Return ""
                End Try
            End Using
        End Function
    γίνεται convert sε μορφή Json με την παρακάτω κλάση,
        'Μετατρέπει ένα DataTable με δεδομένα σε JSON αντικείμενο.
        Public Shared Function GetJSONString(ByVal Dt As DataTable) As String
            Dim StrDc As String() = New String(Dt.Columns.Count - 1) {}
    
            Dim HeadStr As String = String.Empty
            For i As Integer = 0 To Dt.Columns.Count - 1
                StrDc(i) = Dt.Columns(i).Caption
                HeadStr += """" & StrDc(i) & """ : """ & StrDc(i) & i.ToString() & "¾" & ""","
            Next
    
            HeadStr = HeadStr.Substring(0, HeadStr.Length - 1)
            Dim Sb As New StringBuilder()
    
            Sb.Append("{""" & Convert.ToString("WebServiceData") & """ : [")
            For i As Integer = 0 To Dt.Rows.Count - 1
                Dim TempStr As String = HeadStr
                Sb.Append("{")
                For j As Integer = 0 To Dt.Columns.Count - 1
                    TempStr = TempStr.Replace(Dt.Columns(j).ToString & j.ToString() & "¾", Dt.Rows(i)(j).ToString())
                Next
                Sb.Append(TempStr & "},")
            Next
            Sb = New StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1))
    
            Sb.Append("]}")
            Return Sb.ToString()
        End Function
    αλλα πάλι μου βάζει xml header
    <string xmlns="http://www.minosnet.gr/">{"WebServiceData" : [{"CustomerID" : "31","FName" : "Κώστας","LName" : "Κουτρουλάκης"},{"CustomerID" : "32","FName" : "Γιάννης","LName" : "Καραμουσαδάκης"},{"CustomerID" : "33","FName" : "Ιζαμπέλα","LName" : "Στεφανουδάκη"},{"CustomerID" : "34","FName" : "Ναταλία","LName" : "Κελαϊδή"},{"CustomerID" : "35","FName" : "Ειρήνη","LName" : "Ανδρεαδάκη"},{"CustomerID" : "36","FName" : "Μαρία","LName" : "Τζιλιβάκη"},{"CustomerID" : "37","FName" : "Κορίνα","LName" : "Γαρεδάκη"},{"CustomerID" : "38","FName" : "κκκκ","LName" : "Γαρεδάκη"},{"CustomerID" : "39","FName" : "Μανώλης","LName" : "Μυλωνάκης"},{"CustomerID" : "40","FName" : "Γιώργος","LName" : "Τσιλιβάκης"}]}</string>

    πώς μπορώ να επιστρέφει η ςeb method μόνο το Json αντικείμενο; Να επιστρέφω αντικείμενο τύπου Customers?(Με αντίστοιχη κλάση Customer)

    ευχαριστώ και πάλι.

  •  01-02-2011, 11:40 62880 σε απάντηση της 62879

    Απ: web service that returns JSON string

    Έχω την αμυδρή εντύπωση ότι τα web services δεν επιστρέφουν json, αν και δεν είμαι σίγουρος. Από όσο ξέρω τα λέγανε XML Web Services.

    Quick n Dirty solution:

    Φτιάχνεις ένα container αντικείμενο και έχεις ένα method το οποίο κάνει dump το json string. Οπότε παίρνεις ένα xml αντικείμενο από το service, πχ το myObject και απλά του λες κάτι του στυλ string s = myObject.DumpToJSon();

    Παίρνεις μετά το s και το κάνεις deserialize (κάπου έχει πάρει το μάτι ένα JSon.NET)

    Βέβαια από ότι καταλαβαίνω μάλλον θέλεις να αποφύγεις εντελώς το xml, και όχι απλά να το έχεις ως περιτύλιγμα για το json.

    Από την άλλη, μήπως τα πράγματα θα ήταν πιο απλά εάν δεν χρησιμοποιούσες web service και έκανες ένα dump το json string?

    my 2 cents... 

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  01-02-2011, 11:53 62881 σε απάντηση της 62880

    Απ: web service that returns JSON string

    Δήμο, ήδη δείξαμε ότι όντως επιστρέφουν προσθέτωντας ένα attribute στο operation και μερικές γραμμές στο web.config. 

    DaltonGR, τα WCF Data Services τα ανέφερα γιατί είναι πολύ πιο εύκολο και γρήγορο να κάνεις αυτό που ζητάς με αυτά - φτιάχνεις ένα μοντέλο από τη βάση με drag & drop και το κάνεις expose με 5 γραμμές! Σίγουρα πολύ λιγότερο κώδικα από αυτόν που έγραψες για το post σου. Επιπλέον, ο κώδικας που έγραψες σε δεσμεύει σε ένα και μόνο. Τα WCF Data Services σου επιτρέπουν να κάνεις όποιο query θέλεις από τη μεριά του client, φτάνει να κάνεις expose τους κατάλληλους πίνακες ως entities.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-02-2011, 11:55 62882 σε απάντηση της 62881

    Απ: web service that returns JSON string

    Μμμμμ, νόμιζα ότι έλεγες για τα WCF services, sorry.
    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  01-02-2011, 11:56 62883 σε απάντηση της 62879

    Απ: web service that returns JSON string

    Όσον αφορά το xml header, ΜΗΝ μετατρέπεις ΤΙΠΟΤΕ σε string. Τη μετατροπή την κάνει το ίδιο το WCF αφού του είπες να χρησιμοποιήσει JSON. Η ερώτηση στο StackOverflow ρωτάει ακριβώς γιατί εμφανίζεται το XML Header και του απαντάνε να ΜΗΝ προσπαθήσει ο ίδιος να κάνει την μετατροπή και να ΜΗΝ επιστρέψει string.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-02-2011, 11:59 62884 σε απάντηση της 62882

    Απ: web service that returns JSON string

    dimos.homatas:
    Μμμμμ, νόμιζα ότι έλεγες για τα WCF services, sorry.
    Μα γι αυτά λέω. Μπορείς να ορίσεις σε ένα WCF service να επιστρέφει XML ή JSON. 

    Τα WCF Data Services απλά βολεύουν στο σενάριο του DaltonGR περισσότερο από τα απλά WCF Services.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-02-2011, 12:16 62885 σε απάντηση της 62879

    Απ: web service that returns JSON string

    Παναγιώτη το λέω γιατί είδα αυτό:

    DaltonGR:
    μάλλον θα μείνω προσωρινά με τα web services, γιατί απο ότι καταλαβαίνω θέλει αρκετό χρόνο, και επειδή για αρχή θα πρέπει να λειτουργεί κάποιο service πιλοτικά. 

    και υπέθεσα ότι μιλάμε για τα απλά xml web services. Τώρα, τι έχει γίνει με το γενικότερο "πακετάρισμα" κάτω από το WCF στο 4άρι .ΝΕΤ, δεν γνωρίζω. Είχα την εντύπωση πάντως ότι όλα θα αποτελούσαν μέρος του WCF.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  01-02-2011, 12:33 62887 σε απάντηση της 62885

    Απ: web service that returns JSON string

    Αν όταν ο DaltonGR λέει web services εννοεί τα παλιά ASMX web services αρχίζει να βγαίνει νόημα. Εξηγείται έτσι και το WebMethod attribute στην αρχή, το οποίο δεν είχα προσέξει. Εκεί όμως δεν υπάρχει καμμία υποστήριξη για να επιστρέψεις κάτι πέρα από SOAP XML οπότε δεν είναι δυνατόν να ξεφορτωθείς τους xml headers. Επίσης, πρέπει να κάνεις τη μετατροπή σε JSON με το χέρι, με αποτέλεσμα να βγει πολύ περισσότερος κώδικας απ' ότι χρειάζεται.

    Για παράδειγμα, παρακάτω είναι όλος ο κώδικας που χρειάστηκε να γράψω για να βγάλω δεδομένα ως JSON. 

    To web service (κομπλέ με data class και interface). Έφτιαξα ένα Entity Model μόνο με τον πίνακα Customers ( Add > New Item > Data > ADO.NET Data Entity Model και διάλεξα μόνο τον πίνακα Customers από τη λίστα)
     [DataContract]
        public class CustomerDetails
        {
            [DataMember]
            public int CustomerID { get; set; }
            [DataMember]
            public string AccountNumber { get; set; }
        }
    
        [ServiceContract]
        public interface ICustomerService
        {
            [OperationContract, WebGet(
                ResponseFormat = WebMessageFormat.Json,
                RequestFormat=WebMessageFormat.Json,
                UriTemplate="Customers")]
            List<CustomerDetails> GetCustomers();
        }
    
        public class CustomerService : ICustomerService
        {
            public List<CustomerDetails> GetCustomers()
            {
                using (var dbContext = new AdventureWorksEntities())
                {
                    var customers = (from customer in dbContext.Customers
                                    where customer.CustomerType== "I"
                                    select new CustomerDetails
                                               {
                                                   CustomerID=customer.CustomerID,
                                                   AccountNumber=customer.AccountNumber
                                               }).Take(5);
                    var list = customers.ToList();
                    return list;
                }
            }
        }


    και το web.config. Με κόκκινο οι γραμμές που χρειάστηκε να προσθέσω:
    <?xml version="1.0"?>
    <configuration>
    
      <system.web>
        <compilation debug="true" targetFramework="4.0"><assemblies><add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /></assemblies></compilation>
      </system.web>
      <system.serviceModel>
    	  
    	  <services>
    		  <service name="WcfJsonTest.CustomerService">
    			  <endpoint address="" behaviorConfiguration="WcfJsonTest.TestServiceBehavior" binding="webHttpBinding" contract="WcfJsonTest.ICustomerService">
    			  </endpoint>
    		  </service>
    	  </services>
    
    	  <behaviors>
    		  <endpointBehaviors>
    			  <behavior name="WcfJsonTest.TestServiceBehavior">
    				  <webHttp helpEnabled="true" />
    			  </behavior>
    		  </endpointBehaviors>
    		  <serviceBehaviors>
            <behavior>		
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true" />
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="true" />
    			
            </behavior>
          </serviceBehaviors>
    
    	  </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
      </system.webServer>
      
    <connectionStrings><add name="AdventureWorksEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /></connectionStrings></configuration>
    To περίεργο connection string χρησιμοποιείται από το Entity Framework για τη σύνδεση στη βάση, το οποίο δημιουργήθηκε από τον wizard του EF

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-02-2011, 17:29 62897 σε απάντηση της 62853

    Απ: web service that returns JSON string

    http://stackoverflow.com/questions/3311681/android-how-to-access-data-in-an-asp-net-database-via-app

  • Your webservice will still return XML (so you can use it with a soap client) unless you make a HTTPPost request with content-type "application/json"

    http://encosia.com/2010/03/03/asmx-and-json-common-mistakes-and-misconceptions/
    One of the most stubbornly persistent misconceptions about ASMX services is the rumor that they are limited to returning XML. With that notion mind, many developers understandably avoid them for client-side AJAX callbacks. When every byte counts, raw JSON is always preferable to the bloat of XML.However, the introduction of ASP.NET AJAX removed that XML limitation.
    In any ASP.NET 2.0+ AJAX enabled site, one of ASP.NET AJAX’s additions is something called the ScriptService. When a ScriptService is called in the correct manner, it automatically returns its result serialized as JSON instead of XML.

    --HTH--

  •  01-02-2011, 17:53 62903 σε απάντηση της 62897

    Απ: web service that returns JSON string

    Χμμ, δεν θα το έλεγα misconception, απλά άγνοια μίας παλιάς και λίγο ξεπερασμένης τεχνολογίας. 

    Αν κατάλαβα πάντως, αυτό υποννοείς με τις παραπομπές, σε μία φράση, είναι ότι και με ASMX παίζει, φτάνει να ΜΗΝ γυρίσεις string? 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems