【问题标题】:How to Serialize Json to Object in C# without use NewtonSoft如何在不使用 NewtonSoft 的情况下在 C# 中将 Json 序列化为对象
【发布时间】:2017-09-21 06:22:59
【问题描述】:

我尝试将 Json 序列化为“x”类,但我无法使用我的 Json 中的值获取此对象。我想在不使用 NewtonSoft 的情况下做到这一点。 有人可以帮忙吗?

{"Data":{"RI":{"Node":1,"Subnode":1 }},"RU":{"Node":2,"Subnode":2 }}}



public class RootObject{
    public List<Data> Data {get; set;}


    public static Data Deserialize(string jsonData){
        JavaScriptSerializer ser = new JavaScriptSerializer();
        RootObject rootObj = ser.Deserialize<RootObject>(jsonData);    return rootObj;
    }
}

public class Data{
    public RI RI {get; set;}
    public RU RU {get; set;}
}

public class RI{
    public int Node {get; set;}
    public int Subnode {get; set;}
}
public class RU{
    public int Node {get; set;}
    public int Subnode {get; set;}
}

【问题讨论】:

  • I want to do this without use NewtonSoft你能告诉我们你为什么不想使用NewtonSoft吗?
  • 这甚至不是有效的 c#。例如,class 应该是小写的,并且您的静态方法缺少名称(或返回类型?)和返回语句
  • @mjwills,我不能使用 NewtonSoft,因为我的工作中不允许使用这个 DLL。
  • 哇。他们是否解释了为什么您不能使用该 DLL?您是否不允许使用任何 DLL,或者只使用那个? 很抱歉,但手动滚动您自己的 JSON 序列化器太疯狂了。
  • 老实说,回到下令禁止使用 NewtonSoft 并真正讨论的人那里可能是解决问题的更好方法。在这个时代,使用像 NewtonSoft 这样的框架来完成工作只是一种常见的做法,而不必每次都重新发明轮子。另外,像 NewtonSoft 这样的包已经被彻底调试过了,而你编写的任何代码都会有它自己的一组错误。

标签: c#


【解决方案1】:

WCF 中有一些 JSON 内容。

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

你需要用 [DataContract] 和 [DataMember] 来装饰你的类。像这样的。

[DataContract]
public class Data{
    public RI RI {get; set;}
    public RU RU {get; set;}
}

[DataMember]
public class RI{
    public int Node {get; set;}
    public int Subnode {get; set;}
}

[DataMember]
public class RU{
    public int Node {get; set;}
    public int Subnode {get; set;}
}

您没有显示您的 Node 和 Subnode 类;您也必须将它们放入 [DataMember] 类中。

然后您可以将 JSON 放入类似这样的流中:

var data = new Data();
...
/* populate data somehow or other */
...
MemoryStream str = new MemoryStream();  
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
...
ser.WriteObject(str, data);   
...
/* read back that stream */
str.Position = 0;  
StreamReader sr = new StreamReader(st);  
Console.WriteLine(sr.ReadToEnd());   /* or something else useful */

比开发人员应该拥有的更多乐趣。

【讨论】:

  • 我没有调试这个。警告讲师。
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多