0

我有一个类似于以下内容的 JSON 节点。

"folders":[
    {"Videos":[1196717,2874999,898084]},
    {"Fun":[2443301,3671]},
    {"News":[62689,58867,11385]}
]

我想将其反序列化为 aDictionary<string, List<int>>或类似的东西。我目前有会员:

[DataMember(Name = "folders")]
public Dictionary<string, List<int>> Folders;

我希望输出如下:

Folders = new Dictionary<string, List<int>>() {
    {"Videos", new List<int>() { 1196717, 2874999, 898084 }},
    {"Fun",    new List<int>() { 2443301, 3671 }},
    {"News",   new List<int>() { 62689, 58867, 11385 }}
};

我已经将反序列化器实现为:

var serializer = new DataContractJsonSerializer(
    typeof(T),
    new DataContractJsonSerializerSettings() {
        DateTimeFormat = new DateTimeFormat("yyyy-MM-ddTHH:mm:ss.fffffffZ"),
    }
);
T result = (T)serializer.ReadObject(response);

但只是产生错误:

数据合约类型'System.Runtime.Serialization.KeyValue`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.List`1[[System .Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 因为需要的数据成员'Key,未找到值'。

我理解这是因为它期待更像这样的东西,但格式超出了我的控制。

"folders":[
    {
        "key":"Videos",
        "value":[1196717,2874999,898084]
    },{
        "key":"Fun",
        "value":[2443301,3671]
    },{
        "key":"News",
        "value":[62689,58867,11385]
    }
]

我能做些什么来反序列化这个?

4

3 回答 3

1

拥有:C#

public class wrap
{
    public List<Dictionary<string, List<string>>> folders { get; set; }
}

杰森:

{"folders":[
    {"Videos":[1196717,2874999,898084]},
    {"Fun":[2443301,3671]},
    {"News":[62689,58867,11385]}
]
}

使用 NewtonJson 反序列化器:

JsonDeserializer.Deserialize<wrap>(JsonInput)

我通过 3 项词典列表获得了成功的对象。

使用 DataContractJsonSerializer:

var serialzier = new DataContractJsonSerializer(typeof(wrap));
var stream = new MemoryStream(Encoding.UTF8.GetBytes(JsonInput));
Result = (wrap)serialzier.ReadObject(stream);

我得到了包含 3 项字典列表的不成功对象,但它们是空的。也许 DataContractJsonSerializer 需要一些调整?

希望能帮助到你。

于 2016-04-01T11:18:41.927 回答
0

我用JavaScriptSerializer这个。基本上你的 json 实际上是一个Dictionary<string, object>. 我不知道为什么它不允许进行强制列表,但无论如何,这里有一些简单的行可以让你完成你的任务。

请注意,我将其用作 jsonString(即没有“视频:”部分)

[
    {"Videos":[1196717,2874999,898084]},
    {"Fun":[2443301,3671]},
    {"News":[62689,58867,11385]}
]

如果您希望它与视频一起使用,那么它是一个更高级别的字典,即Dictionary<string, Dictionary<string, object>>但以相同的方式工作

代码:

    Dictionary<string, List<int>> result = new Dictionary<string, List<int>>();
    object[] desirializedJsonObject =(object[])new JavaScriptSerializer().DeserializeObject(jsonString);
    foreach (var obj in desirializedJsonObject)
    {
        // Get the record
        var firstRecord   = ((Dictionary<string, object>)obj).First();

        // Creat list of values
        var listOfValues = ((object[])firstRecord.Value).Select(x => Convert.ToInt32(x)).ToList();

        result.Add(firstRecord.Key, listOfValues);
    }
于 2013-08-25T11:12:22.307 回答
0

使用 KeyValuePair 类而不是字典,

List<KeyValuePair<string, List<string>>> uploadedfiles = JsonConvert.DeserializeObject<List<KeyValuePair<string, List<string>>>>(json)

于 2019-08-22T14:36:48.063 回答