如何反序列化这个JSON字符串?

4

我一直在尝试将一个JSON对象反序列化为C#类。当我从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个回答

3
您在 Mes 类中的属性是私有的。请将这些属性添加 public 访问修饰符。
将其更改为以下内容:
public class Mes
{
    public string valor;
    public string almacenado;
}

不,OP代码没有为“Mes”类上的字段包括访问修饰符。默认情况下,在没有访问修饰符的类上声明的字段被解释为私有。https://msdn.microsoft.com/zh-cn/library/ba0a1yw2.aspx - thepirat000
但是代码从一开始就有公共修饰符。在以下链接中,您可以看到从一开始类Mes具有PUBLIC修饰符访问权限:stackoverflow.com/posts/40533428/revisions - JorgeAM
即使在您提供的链接中,“Mes”是公共的,但“Mes”上的“valor”和“almacenado”字段没有任何修饰符,只有“string valor;”。 - thepirat000
1
你说得对,类的访问修饰符是public,但没有属性修饰符。因此,默认情况下,属性是私有的,这导致序列化无法正常工作。我已经更改了属性修饰符,现在它可以正常工作了。我知道属性必须是public才能正确地进行序列化,但是对于子类Mes,我忘记写它们了。非常感谢,现在它就像我想要的那样工作了。谢谢你(如果我的英语不太好,请见谅) - JorgeAM

2
我不喜欢JavaScriptSerializer,我更喜欢使用Newtonsoft的Json.net。
可以通过NuGet获取:
```

这可以通过NuGet获得:

```
> Install-Package Newtonsoft.Json -Version 9.0.1

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

可能是因为这并没有回答问题。你的建议是完全改变类结构和序列化库。 - thepirat000
@thepirat000 可能是因为使用这种类结构需要编写自定义解析器? - mybirthname

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接