2012-10-02 1 views
1

plz help, я застрял. У меня есть службы WCF, которая возвращает что-то вроде этого:Попытка десериализации JSON с использованием JSON.NET и DataContractJsonSerializer не работает

{ 
    "GetDataRESTResult": 
    [ 
     {"Key1":100.0000,"Key2":1,"Key3":"Min"}, 
     {"Key1":100.0000,"Key2":2,"Key3":"Max"} 
    ] 
} 

, и я хотел бы десериализации, но все, что я использую (JSON.NET или DataContractJsonSerializer) Я получаю сообщение об ошибке. При использовании DataContractJsonSerializer я использую код TheIs:

byte[] data = Encoding.UTF8.GetBytes(e.Result); 
MemoryStream memStream = new MemoryStream(data); 
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<DataDC>)); 
List<DataDC> pricinglist = (List<DataDC>)serializer.ReadObject(memStream); 

где DataDC является контракт данных, который я получил от ссылки на службу службы WCF REST Я получаю JSON данные, и ошибка Я получаю InvalidCastException ...

Попытка использования JSON.NET Я получаю еще одно исключение, но все же ничего не могу понять, может ли кто-нибудь помочь, пожалуйста?

EDIT Вот JSON.NET StackTrace:

Не может десериализации текущего объекта JSON (например, { "имя": "значение"}) в тип «System.Collections.Generic.List` 1 [MyApp.MyServiceReference.DataDC] ' , потому что для этого требуется массив JSON (например, [1,2,3]) для десериализации . Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным типом .NET (например, не примитивным типом типа, а не набором типа типа или списка), который можно десериализовать из объекта JSON . JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь 'GetDataRESTResult', строка 1, позиция 23.

ответ

3

Ниже код работает

string json = @" {""GetDataRESTResult"":[{""Key1"":100.0000,""Key2"":1,""Key3"":""Min""},{""Key1"":100.0000,""Key2"":2,""Key3"":""Max""}]}"; 

dynamic dynObj = JsonConvert.DeserializeObject(json); 
foreach (var item in dynObj.GetDataRESTResult) 
{ 
    Console.WriteLine("{0} {1} {2}", item.Key1, item.Key3, item.Key3); 
} 

Вы также можете использовать Linq

var jObj = (JObject)JsonConvert.DeserializeObject(json); 
var result = jObj["GetDataRESTResult"] 
       .Select(item => new 
       { 
        Key1 = (double)item["Key1"], 
        Key2 = (int)item["Key2"], 
        Key3 = (string)item["Key3"], 
       }) 
       .ToList(); 
6

{ "GetDataRESTResult": [{» Key1 »: 100.0000,« Key2 »: 1,« Key3 »:« Min »}, {« Key1 »: 100.0000,« Key2 »: 2,« Key3 »:« Max »}]}

Вы являетесь объектом JSON (где он имеет один ключ «GetDataRESTResult» с массивом JSON в качестве значения). Из-за этого тип, который вы должны десериализовать, должен быть объектом, а не коллекцией.

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataDC)); 
DataDC pricinglist = (DataDC)serializer.ReadObject(memStream); 

Это будет работать, если ваш тип DataDC выглядеть примерно так:

public class DataDC 
{ 
    public List<Keys> GetDataRESTResult { get; set; } 
} 
public class Keys 
{ 
    public double Key1 { get; set; } 
    public int Key2 { get; set; } 
    public string Key3 { get; set; } 
} 
+0

Мэгги, спасибо кучу за ваш ответ, к сожалению, я не был в состоянии изменить DataDC, как это авто сгенерированный и полученный из метода службы WCF REST с именем GetDataREST(), который не был настроен на отправку JSON в голом формате, и именно поэтому он добавляет, что ключ GetDataRESTResult json ... ваш ответ очень полезен, и именно поэтому я его проголосовал но я хочу по-прежнему использовать DC ссылки на службу, вместо того чтобы писать свой собственный каждый раз, когда он может меняться ... вот почему я пошел на второй ответ, в котором я, надеюсь, получаю D ataDC применяется к jObj ["GetDataRESTResult"] объекту легко – dada