我觉得我做得比实际需要的要困难得多。
在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.
但是它没有被格式化为数组(或者我不会在这里) - 需要帮助找出如何反序列化值对象,同时基本上忽略字符串标识符。
提前致谢
答案 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"
}