سؤال

بشكل افتراضي خدمة WCF التفاف سلمان الاستجابة في "د" المجمع و هناك وجدت مشكلة في تحليل ذلك.

إذا كنت تحليل مع JsonConvert.Deserializeobject العلامة(استجابة) حيث رد

"{\"d\":\"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}\"}"

أنا جور خطأ:

After parsing a value an unexpected character was encoutered: a. Line 1, position 9.

إذا قمت بتغيير الاستجابة في

"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}"

حصلت عليه العمل.

حتى كيفية تحليل هذه "د" ملفوفة سلمان الردود من صندوق رأس المال العامل ؟ هل هناك أي طريقة أفضل تحليل JSON ؟

هل كانت مفيدة؟

المحلول 4

الآن تخلصت من "د" المجمع مع Regex.استبدال وإصلاح سلمان استجابة مع بنية سليمة

{\"Guid\":\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\",\"Name\":\"Thelma\"}
{\"Guid\":\"d56d4d4f-6029-40df-a23b-de27617a1e43\",\"Name\":\"Lousie\"}\"}

أنا أيضا جعل فئة مع Guid اسم تعريف السلسلة في ذلك.

ثم محاولة إلغاء تسلسل مع

List<myStruct> o = JsonConvert.DeserializeObject<List<myStruct>>(response);

ولكن أنا على خطأ

Expected a JsonObjectContract or JsonDictionaryContract for type 'System.Collections.Generic.List`1[mynamespace.myStruct]', got 'Newtonsoft.Json.Serialization.JsonArrayContract'.

أين هي الخدعة ؟

نصائح أخرى

أنا على افتراض أنك تستخدم <enableWebScript/> في سلوكك التكوين استبدال ذلك مع <webHttp defaultOutgoingResponseFormat="Json"/> وسوف تحصل على لطيفة ونظيفة سلمان, لا "د" و لا "__نوع"

يبدو أنك تستخدم enableWebScript السلوك على webHttpBinding.ربما عليك أن تكون باستخدام webHttp السلوك بدلا من ذلك - وهذا يعطي لك "نظيفة" سلمان بدلا من ASP.NET اياكس العميل JSON.

خذ سلمان ولصقه في الصف على الانترنت. مولد, مثل http://httputility.net/json-to-csharp-vb-typescript-class.aspx.وسوف توفر لك رمز إلغاء تسلسل هذا الكائن سلمان في مثل هذا (VB سبيل المثال):

Public Class MyClass
     Public Property D As String
End Class

لصق هذا في المشروع و إلغاء تسلسل سلمان إلى هذا الكائن.د الممتلكات الآن هو سلسلة التي تحتوي على ملفوف سلمان سوف تحتاج إلى إلغاء تسلسل للمرة الثانية في النهائي تلقي هدف.إذا كنت غير متأكد من فئة سوف تحتاج إلى التعامل معها ، لصق السلسلة في د إلى نفس الطبقة الانترنت مولد سيكون لديك رمز من الضروري خلق نوع لتلقي وجوه!

إذا كنت تقوم بالتبديل إلى WebHttpBehavior و كنت لا تزال تحصل على رسالة خطأ حول الجسم العناصر لا يجري ملفوفة يدويا تعيين نمط الجسم من الأساليب التي تتعامل مع ملفوفة.تفعل ذلك كما يلي:

[OperationContract(BodyStyle = WebMessageBodyStyle.ملفوفة،...)] سلسلة DoSomething(...)

ويساعد هذا الأمل!

هل يمكن أن يكون إلغاء التسلسل المجمع الفئة التي لديها خاصية واحدة تسمى "د".مرة واحدة كنت قد نجحت في إلغاء تسلسل عليه ثم الحصول على قيمة من د الممتلكات.

ربما هذا يساعد.

الخدمة:

namespace Application.Service
{
        [ServiceBehavior(UseSynchronizationContext = false,
        ConcurrencyMode = ConcurrencyMode.Multiple,
        InstanceContextMode = InstanceContextMode.PerCall),
        AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class VendorService : IVendorService
        {
          public List<Vendor> RetrieveMultiple(int start, int limit, string sort, string dir)
          {
             //I don't do any manual serialization
             return new Vendor();
          }
        }
}

العقد:

    [ServiceContract(Namespace = "Application.Service.Contracts")]            
    public interface IVendorService
    {
       [OperationContract]
       [WebInvoke(ResponseFormat=WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        List<Vendor> RetrieveMultiple(int start, int limit, string sort, string dir);
     }

بلدي الملف Svc فقط هذا السطر:

<%@ ServiceHost Service="Application.Service.VendorService" %>

ويب.التكوين

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <behaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <enableWebScript />
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DefaultServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  <service behaviorConfiguration="DefaultServiceBehavior" name="Application.Service.VendorService">
    <endpoint behaviorConfiguration="jsonBehavior" address="" binding="webHttpBinding" contract="Application.Service.Contracts.IVendor" />
  </service>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top