[英]JSON deserialization without using classes? (webservice client)
我试图解决 C# 更喜欢生成类的问题(我知道它们很容易生成,但由于客户端和服务器端的开发,目前我的格式和参数发生了很大变化)。
当我试图找出反序列化时,我最常发现的一个例子是,你首先必须知道确切的结构——然后构建一个类——然后你可以稍后引用它(这很好,但这不是我想要的想做):
JSON格式1:
[{"FirstName":"Bob","LastName":"Johnson"},{"FirstName":"Dan","LastName":"Rather"}]
public class People
{
public string FirstName { get; set; }
public string LastName { get; set;}
}
public List<People> peopleList;
. . . // (same as first example)
//Change the deserialize code to type <List<Class>>
peopleList = deserial.Deserialize<List<People>>(response);
只要回复不更改格式,这当然很容易,例如,如果回复更改为嵌套字段:
JSON格式2:
[{"FirstName":"Bob","LastName":"Johnson"},{"data":{"nestedfield1":"ewr"} }]
我当然必须更改类来表示它,但目前我们正在格式上来回移动,我想知道是否有一种方法可以尝试直接在字符串中访问 json 元素?
例如,就像我可以在 Python 中做的那样:
mystring1 = reply ["firstName"] mystring2 = reply ["data"]["nestedfield1"]
有什么办法可以在 C# 中实现这一点吗? 如果有一种方法可以访问它而无需首先引用代码中的输出,然后再次引用在引用它时创建的类变量,那么它将快速加快开发速度。
并注意它是为了快速开发,不一定是为了最终实现,我可以通过类方法看到优势。
另一种询问方式是它是否可以序列化采用任何格式(只要它的 JSON)并动态构建一个结构,在那里我可以使用命名键而不是类变量来访问它?
在不使用可以使用using Newtonsoft.Json
类的情况下反序列化 json
这是代码:
using System;
using Newtonsoft.Json;
using System.Text;
public class Program
{
public static void Main()
{
var myJSONString = "[{\"FirstName\":\"Bob\",\"LastName\":\"Johnson\"},{\"FirstName\":\"Dan\",\"LastName\":\"Rather\"}]";
dynamic obj = JsonConvert.DeserializeObject<dynamic>(myJSONString);
Console.WriteLine(obj[0].FirstName);
}
}
obj
执行方式与您在生成类时使用的方式相同,它可以采用任何 json 字符串并反序列化为动态对象,而不管 json 的结构如何。 请记住,您不会获得 VS 智能感知支持。
更新
这是小提琴:
https://dotnetfiddle.net/xeLDpK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.