【问题标题】:JSON deserialization without using classes? (webservice client)不使用类的 JSON 反序列化? (网络服务客户端)
【发布时间】:2018-07-09 05:22:35
【问题描述】:

我试图解决 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)并动态构建一个结构,我可以使用命名键而不是类变量来访问它吗?

【问题讨论】:

    标签: c# json.net restsharp


    【解决方案1】:

    要在不使用类的情况下反序列化 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 智能感知支持。

    更新
    这是小提琴:
    https://dotnetfiddle.net/xeLDpK

    【讨论】:

    • 可能值得更新您的代码示例以演示访问动态对象的属性(可能具有几种不同的数据类型)?
    • 我怎样才能将自己编入索引?如果我想得到: obj["firstname"] ?
    • 简单使用obj.firstname,我会更新答案添加示例代码
    • 感谢它的工作,从来不知道这在 C# 中是可能的!
    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多