2016-11-10 73 views
4

我一直在嘗試將C#類的JSON對象淡化。我的JSON Objetc(當我從Request.InputStream閱讀)如下:如何反序列化這個JSON字符串?

{ 
    "accion":"Guardar", 
    "ejercicio":"2017", 
    "codigoPieza":"13", 
    "solicitado":"61", 
    "solicitante":"46", 
    "listadoMeses":{ 
     "Enero":{ 
     "valor":"1", 
     "almacenado":"false" 
     }, 
     "Febrero":{ 
     "valor":"", 
     "almacenado":"true" 
     }, 
     "Mayo":{ 
     "valor":"2", 
     "almacenado":"true" 
     }, 
     "Agosto":{ 
     "valor":"2", 
     "almacenado":"true" 
     }, 
     "Noviembre":{ 
     "valor":"2", 
     "almacenado":"true" 
     } 
    } 
} 

這反序列化。如果正確我有這個類:

public class RespuestaUsuario 
{ 
     public string accion { get; set; } 
     public string ejercicio { get; set; } 
     public string codigoPieza { get; set; } 
     public string solicitado { get; set; } 
     public string solicitante { get; set; } 
     public Dictionary<string, Dictionary<string, string>> listadoMeses { get; set; } 
    } 

但我想使用這個類:

public class RespuestaUsuario 
{ 
    public string accion { get; set; } 
    public string ejercicio { get; set; } 
    public string codigoPieza { get; set; } 
    public string solicitado { get; set; } 
    public string solicitante { get; set; } 
    public Dictionary<string, Mes> listadoMeses { get; set; } 
} 

public class Mes 
{ 
    string valor; 
    string almacenado; 
} 

可悲的是,如果我用最後的代碼,該詞典對每個(字符串鍵)一個項目一個月(listadoMeses的每次迭代),但每個實例的Mes類有兩個屬性NULL

我如何處理最後幾堂課?

我用反序列化的代碼如下(但這些信息,我想,是沒用的,因爲在這兩種情況下是相同的):

System.IO.Stream str = Request.InputStream; 
str.Position = 0; 
string datos = String.Empty; 
using (StreamReader reader = new StreamReader(str, Encoding.UTF8)) 
{ 
    datos = reader.ReadToEnd(); 
} 

JavaScriptSerializer serializador = new JavaScriptSerializer(); 
RespuestaUsuario respuesta = (RespuestaUsuario)serializador.Deserialize<RespuestaUsuario>(datos); 

回答

3

你屬性Mes類是私有的。將public訪問修飾符添加到屬性。

它改成這樣:

public class Mes 
{ 
    public string valor; 
    public string almacenado; 
} 
+0

Mes類的訪問修飾符已經是** public ** – Neoff

+0

否。OP代碼不包含'Mes'類中字段的訪問修飾符。默認情況下,在沒有訪問修飾符的類上聲明的字段將被解釋爲私有。 https://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx – thepirat000

+0

但是代碼從開始就有公共修飾符。在下面的鏈接,你可以看到如何從開始類Mes具有PUBLIC修飾符訪問: \t [stackoverflow.com/posts/40533428/revisions](http://stackoverflow.com/posts/40533428/revisions) – Neoff

1

使用Newtonsoft.Json。在這裏你的班級應該是什麼樣子的!

public class Enero 
{ 
    public string valor { get; set; } 
    public string almacenado { get; set; } 
} 

public class Febrero 
{ 
    public string valor { get; set; } 
    public string almacenado { get; set; } 
} 

public class Mayo 
{ 
    public string valor { get; set; } 
    public string almacenado { get; set; } 
} 

public class Agosto 
{ 
    public string valor { get; set; } 
    public string almacenado { get; set; } 
} 

public class Noviembre 
{ 
    public string valor { get; set; } 
    public string almacenado { get; set; } 
} 

public class ListadoMeses 
{ 
    public Enero Enero { get; set; } 
    public Febrero Febrero { get; set; } 
    public Mayo Mayo { get; set; } 
    public Agosto Agosto { get; set; } 
    public Noviembre Noviembre { get; set; } 
} 

public class RootObject 
{ 
    public string accion { get; set; } 
    public string ejercicio { get; set; } 
    public string codigoPieza { get; set; } 
    public string solicitado { get; set; } 
    public string solicitante { get; set; } 
    public ListadoMeses listadoMeses { get; set; } 
} 

如何將json反序列化爲對象。

RootObject result = JsonConvert.DeserializeObject<RootObject>(json); 

這裏Dotnet Fiddle

+0

爲什麼downvote? – mybirthname

+0

可能因爲這不回答問題。你的建議是徹底改變類結構和序列化程序庫。 – thepirat000

+0

@ thepirat000可能是因爲有了這個類結構他需要編寫自定義分析器? – mybirthname

2

我不喜歡JavaScriptSerializer,我更喜歡使用Json.net從newtonsoft

這可以通過NU獲得獲得:

> Install-Package Newtonsoft.Json -Version 9.0.1 
相關問題