我试图解决的问题是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);
如果回复不更改格式,那么当然很容易,如果ex回复更改为嵌套字段:
Json格式2:
[{“ FirstName”:“ Bob”,“ LastName”:“ Johnson”},{“ data”:{“ nestedfield1” :“ ewr”}}]
我当然必须更改类以表示该类,但是此刻我们正在以格式来回移动,我想知道是否有一种方法可以尝试直接在字符串中访问json元素?
例如我可以在Python中完成的操作
mystring1 = reply ["firstName"] mystring2 = reply ["data"]["nestedfield1"]
如果有一种访问方法而无需先引用代码中的输出然后再次引用在引用它时创建的类变量的方法,那么在C#中是否有任何方法可以实现此目的,从而可以加快开发速度。 / p>
并注意它的快速发展,而不是最终实现的必要性,在这种情况下,我可以通过使用类方法看到优点。
另一种询问方式可能是它可以采用任何格式(只要其JSON)进行序列化并动态构建一个结构,在该结构中我可以使用命名键而不是类变量来访问它?
答案 0 :(得分:3)
要不使用类反序列化json,可以使用using Newtonsoft.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 intellisense支持。
更新
小提琴在这里:
https://dotnetfiddle.net/xeLDpK