使用变量名数组反序列化 JSON

Posted

技术标签:

【中文标题】使用变量名数组反序列化 JSON【英文标题】:Deserialize JSON with variable name arrays 【发布时间】:2015-03-18 03:02:58 【问题描述】:

我正在获取从 REST Web 服务返回的 JSON 以用于调查响应。它具有一些名称值对的名称部分的数组。此外,名称将根据所问问题的类型而有所不同。我正在使用 JSON.net 并尝试将返回的值反序列化为某种类型的对象树,我可以行走但无法弄清楚使用什么结构来填充它。

我在 LinqPad 中测试了以下 sn-p 并且字段始终为空。有什么方法可以轻松读取变量数据还是我必须在代码中解析它?

void Main() 
    string json = @"
      'result_ok':true,
      'total_count':'51',
      'data':[
        'id':'1',
        'status':'Deleted',
        'datesubmitted':'2015-01-12 10:43:47',
        '[question(3)]':'Red',
        '[question(4)]':'Blue',
        '[question(18)]':12,
        '[variable(\'STANDARD_IP\')]':'127.0.0.1',
        '[variable(\'STANDARD_GEOCOUNTRY\')]':'United States'
      ]
    ";
    var responses = JsonConvert.DeserializeObject<RootObject>(json);
    responses.Dump();


public class RootObject 
    public bool result_ok  get; set; 
    public string total_count  get; set; 
    public List<Response> data  get; set; 


public class Response 
    public string id  get; set; 
    public string status  get; set; 
    public string datesubmitted  get; set; 
    public List<object> fields = new List<object>();

【问题讨论】:

我不完全确定,但这对我来说甚至都不是有效的 json。 jsoneditoronline.org 和 .Net JSON 可视化工具似乎可以处理它。 虽然有些库可能会处理它,但属性名称周围的单引号不符合规范。规范需要双引号。 尝试将data的类型改成Dictionary&lt;string, object&gt;[],然后用你自己的逻辑将每个字典转换成Response 【参考方案1】:

Response 类中的fields 属性更改为Dictionary&lt;string, object&gt;,然后用[JsonExtensionData] 属性标记它,如下所示:

public class Response

    public string id  get; set; 
    public string status  get; set; 
    public string datesubmitted  get; set; 
    [JsonExtensionData]
    public Dictionary<string, object> fields  get; set; 

所有具有奇怪属性名称的字段都将被放入字典中,您可以在其中正常访问它们。不需要额外的代码。

这是一个演示:https://dotnetfiddle.net/1rQUXT

【讨论】:

@Brain Rogers 对于 dotnetfiddle.net ,以前不知道。很酷。

以上是关于使用变量名数组反序列化 JSON的主要内容,如果未能解决你的问题,请参考以下文章

JSON序列化

扩展方法对json序列化及反序列化

使用C# json 二维数组 反序列化

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

反序列化 Json 出现错误“无法反序列化当前 JSON 数组”

使用 Unity JsonUtility 反序列化 JSON 数组无法获取序列化值