2013-07-01 3 views
2

Я уверен, что этот вопрос задавали снова и снова, но по какой-то причине мне все еще не удается заставить это работать.Deserialization объекта JSON с помощью DataContractJsonSerializer в C#

Я хочу десериализовать объект JSON, содержащий один элемент; строковый массив:

[{"idTercero":"cod_Tercero"}] 

Это класс, который я пытаюсь десериализации в:

[DataContract] 
public class rptaOk 
{ 
    [DataMember] 
    public string idTercero { get; set; } 

    public rptaOk() { } 

    public rptaOk(string idTercero) 
    { 
     this.idTercero = idTercero; 
    } 
} 

Это метод, который я пытаюсь десериализации:

public T Deserialise<T>(string json) 
    { 
     DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      T result = (T)deserializer.ReadObject(stream); 
      return result; 
     } 
    } 

И так Я пытаюсь заполнить объект:

rptaOk deserializedRpta = deserializarOk(rpta); 

Но по какой-то причине, это возвращает «»

MessageBox.Show(deserializedRpta.idTercero); 
+2

В вашем примере у json есть массив объектов, а не сам объект. Возможно, это твоя проблема? –

+0

Возможно, это помогает и кому-то еще: https: //kashfarooq.wordpress.com/2011/01/31/create-net-objects-from-json-using-datacontractjsonserializer/ –

+0

'public T Deserialise (строка json)' - рассмотрим добавление статического значения после public – serup

ответ

2

Я думаю, что вы делаете это намного сложнее, чем это должно быть. Во-первых, ваш образец json и класс, который вы пытаетесь десериализовать, не имеют массива строк. Они имеют одно свойство типа string. Во-вторых, почему вы используете этот класс DataContractJsonSerializer? Вы ничего не делаете с этим, что вы не можете получить от простого вызова метода универсальной десериализации json.NET. Я бы удалил весь ваш код, кроме определения класса, и заменил его на этот простой один лайнер;

rptaOk[] myInstances = JsonConvert.DeserializeObject<rptaOk>(jsonString); 

Кроме того, независимо от того, какова структура вашего JSON есть, если у вас есть класс, чтобы правильно моделировать его, что метод будет правильно десериализации его. Если вы хотите применить какой-то контракт, я рекомендую использовать json-схемы, которые также поддерживает json.NET. Если вы используете схему, она применяет жесткий контракт, если вы пытаетесь десериализоваться в объект, есть что-то вроде неявного контракта. Я не знаю каждый сценарий, который заставит его бросить, но если ваш json слишком далек от определения класса, он будет. Если у вашего класса есть свойства, которые не отображаются в json, я считаю, что они просто инициализируются значениями по умолчанию для этого типа.

EDIT: Я просто заметил, что ваш json на самом деле представляет собой массив объектов. Таким образом, вам просто нужно сделать lhs этого назначения массивом или объектами rptaOk, а не синглом.

2

Я не знаю, если вы как раз изменить желает идти в библиотеку, которую вы используете, но я использую библиотеку «Newtonsoft.Json» для desserialize объектов JSON, это довольно простой в использовании

[HttpPost] 
    public void AddSell(string sellList) 
    { 
     var sellList = JsonConvert.DeserializeObject<List<Sell>>(sellListJson); 
     BD.SaveSellList(sellList); 
    } 

Как вы можете видеть, вы можете десериализовать весь список объектов json в List <> для типа «Sell», объекта, который я создал ... И, конечно же, вы можете сделать это и в массиве. Я не знаю, правильный синтаксис для этого, но вы можете преобразовать этот список в массив после

Надеются, что это помогает

3

без каких-либо зависимостей вне рамок .net, вы могли бы сделать это таким образом

[DataContract(Name="rptaOk")] 
public class RptaOk 
{ 
    [DataMember(Name="idTercero")] 
    public string IdTercero { get; set; } 
} 

[CollectionDataContract(Name="rptaOkList")] 
public class RptaOkList : List<RptaOk>{} 

var stream = new StreamReader(yourJsonObjectInStreamFormat); 
var serializer = new DataContractSerializer(typeof(RptaOkList)); 
var result = (RptOkList) serializer.ReadObject(stream); 
+5

serializer.ReadObject за исключением только типа потока. StreamReader не наследует от Stream – JBone

Смежные вопросы