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

4
我收到了来自调查响应的REST Web服务返回的JSON。一些名值对的名称部分有数组。此外,名称将因所提问的问题类型而异。我正在使用JSON.net并尝试将返回的值反序列化为某种对象树,以便我可以遍历,但是无法确定使用什么结构来填充它。
我在LinqPad中测试了以下片段,并且fields始终为空。是否有一种简单的方法来读取可变数据,还是我必须在代码中解析它?
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。 - Sam Axe
http://jsoneditoronline.org/ 和 .Net 的 JSON 可视化工具似乎可以很好地处理它。 - Brad Patton
2
虽然一些库可能会处理它,但是在属性名称周围使用单引号是不符合规范的。规范要求使用双引号。 - Sam Axe
尝试将data的类型更改为Dictionary<string, object>[],然后使用自己的逻辑将每个字典转换为Response - SimpleVar
1个回答

5

Response 类中的 fields 属性更改为 Dictionary<string, object>,然后使用 [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,之前不知道。非常酷。 - loneshark99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接