C#JSON反序列化相同的对象,它就像一个数组,而不是一个数组

时间:2018-04-05 16:05:26

标签: c# json

我觉得我做得比实际需要的要困难得多。

在C#中使用Netwonsoft JSON Compact和外部数据。试图找出如何反序列化/解析看起来像

的数据
{"http":{"0":{"title":"arbitrary","value":"arbitrary"},"1":{"title":"arbitrary","value":"arbitrary"}},"sip":{"1003":{"title":"arbitrary","value":"none"}}}

它本质上是一系列通知和ID - " 0"," 1"和" 1003"在上面的例子中,它是一个任意值,似乎有效范围为0,大约为65535.

但是它没有被格式化为数组(或者我不会在这里) - 需要帮助找出如何反序列化值对象,同时基本上忽略字符串标识符。

提前致谢

2 个答案:

答案 0 :(得分:1)

您无法轻松地将其反序列化为数组,但您可以使用整数键将其反序列化为词典。我不了解Json.NET Compact,但这适用于常规的Json.NET:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

class Root
{
    public Dictionary<int, Property> Http { get; set; }
    public Dictionary<int, Property> Sip { get; set; }
}

class Property
{
    public string Title { get; set; }
    public string Value { get; set; }
}

class Test
{
    static void Main()
    {
        string json = File.ReadAllText("test.json");
        var root = JsonConvert.DeserializeObject<Root>(json);
        foreach (var entry in root.Http)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value.Title}/{entry.Value.Value}");
        }
    }
}

如果您确实需要将属性作为数组,我建议使用两个单独的类:一个用于JSON表示,另一个用于实际用法。例如:

class RootJson
{
    public Dictionary<int, Property> Http { get; set; }
    public Dictionary<int, Property> Sip { get; set; }
}

class Root
{
    // TODO: Control access more :)
    public Property[] Http { get; set; }
    public Property[] Sip { get; set; }
}

然后:

var rootJson = ...;
var root = new Root
{
    Http = rootJson.Http.Values.ToArray(),
    Sip = rootJson.Sip.Values.ToArray(),
};

答案 1 :(得分:0)

如果您无法更改JSON的结构,您可以随时执行此类操作。 dynamic类型计算出在运行时要做什么。

dynamic d = JsonConvert.DeserializeObject("{'http':{'0':{'title':'arbitrary','value':'arbitrary'},'1':{'title':'arbitrary','value':'arbitrary'}},'sip':{'1003':{'title':'arbitrary','value':'none'}}}");

Console.WriteLine(d.http["0"].title); // arbitrary

foreach(var prop in d.http) {
  Console.WriteLine(prop);   
}

foreach(var prop in d.sip) {
  Console.WriteLine(prop);   
}

最终输出:

arbitrary
"0": {
  "title": "arbitrary",
  "value": "arbitrary"
}
"1": {
  "title": "arbitrary",
  "value": "arbitrary"
}
"1003": {
  "title": "arbitrary",
  "value": "none"
}