2015-04-07 18 views
7

Bu, Android cihazlardan istekleri alan bir WCF hizmetidir. Aynı istek, lollyop cihazlarından değil, jelibon cihazlarından değil, çünkü jellybean JSON'u yaratımda farklı şekilde düzenler.JSON alanlarının değiştirileceği yer olan Newtonsoft JSON.net serileştirme hatası

istisna:

beklenmeyen belirteç nesnesi deserializing: String. Yol 'SearchFilters.config $ tür.', Satır 1, pozisyon 212.

Json Sigara çalışan:

{ 
    "DeviceType": 2, 
    "SearchFilters": { 
     "config": { 
      "$values": [ 
       { 
        "Collection": { 
         "DeviceType": 2 
        }, 
        "Category": "" 
       } 
      ], 
      "$type": "System.Collections.Generic.List`1[[Yoosh.SharedClasses.YooshConfig, YooshSharedClassesDll]], mscorlib" 
     } 
    }, 
    "RequestingUserId": "66666666-6666-6666-6666-666666666666", 
    "APIKey": "xxx" 
} 

Çalışma Json:

{ 
    "APIKey": "xxx", 
    "DeviceType": 2, 
    "RequestingUserId": "66666666-6666-6666-6666-666666666666", 
    "SearchFilters": { 
     "config": { 
      "$type": "System.Collections.Generic.List`1[[Yoosh.SharedClasses.YooshConfig, YooshSharedClassesDll]], mscorlib", 
      "$values": [ 
       { 
        "Category": "", 
        "Collection": { 
         "DeviceType": 2 
        } 
       } 
      ] 
     } 
    } 
} 

bazı alanlar farklı olan sipariş .. Tek fark bu.

C# sınıfı:

public class QueryParameters 
{ 
    BaseParameters m_baseParameters; 
    Guid m_gRequestingUserId; 
    Dictionary<string, object> m_SearchFilters; 

    [DataMember] 
    public string APIKey 
    { 
     get { return m_baseParameters.APIKey; } 
     set { m_baseParameters.APIKey = value; } 
    } 

    [DataMember] 
    public BaseParameters.YooshDeviceType DeviceType 
    { 
     get { return m_baseParameters.DeviceType; } 
     set { m_baseParameters.DeviceType = value; } 
    } 

    [DataMember] 
    public string DeviceId 
    { 
     get { return m_baseParameters.DeviceId; } 
     set { m_baseParameters.DeviceId = value; } 
    } 

    [DataMember] 
    public Guid RequestingUserId 
    { 
     get { return m_gRequestingUserId; } 
     set { m_gRequestingUserId = value; } 
    } 

    [DataMember] 
    public Dictionary<string, object> SearchFilters 
    { 
     get { return m_SearchFilters; } 
     set { m_SearchFilters = value; } 
    } 
} 

Json.net sürümü: 6.0.8

+0

$ türüne özeldir. Onu yeniden düzenleyebileceğini sanmıyorum. Newtonsoft Json, seri hale getirme sırasında hangi C# nesnesinin oluşturulacağını belirlemek için kullanır. Bir sözlüğünüz olduğundan, ne tür bir nesnenin oluşturulacağını anlamak için muhtemelen $ türüne ihtiyaç duyar. –

+0

Olası kopyası http://stackoverflow.com/questions/15570510 –

+2

'66666666-6666-6666-6666-666666666666' - Canavarın Kimliği – arootbeer

cevap

11

Seti JsonSerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead. documentation göre

:

Bu örnek JSON Meta veri özellikleri bir nesnenin başında olması gerekmez MetadataPropertyHandling readAhead ayarlı ile deserializes.

string json = @"{ 
    'Name': 'James', 
    'Password': 'Password1', 
    '$type': 'MyNamespace.User, MyAssembly' 
}"; 

object o = JsonConvert.DeserializeObject(json, new JsonSerializerSettings 
{ 
    TypeNameHandling = TypeNameHandling.All, 
    // $type no longer needs to be first 
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead 
}); 

Not Bu ayar impact performance olacak söyledi.

+1

Teşekkürler, hafta sonundan sonra test edeceğim ama eminim Bu işe yarayacak:] Değilse güncelleyecektir. –

İlgili konular