gpt4 book ai didi

c# - 如何使用非标准(和变化的)属性名称(在 .NET 中)反序列化 JSON

转载 作者:行者123 更新时间:2023-11-30 20:40:03 29 4
gpt4 key购买 nike

我必须读取一个 JSON 流(我无法控制它),它的形式是:

{"files":
{
"/some_file_path.ext": {"size":"1000", "data":"xxx", "data2":"yyy"},
"/other_file_path.ext": {"size":"2000", "data":"xxx", "data2":"yyy"},
"/another_file_path.ext": {"size":"3000", "data":"xxx", "data2":"yyy"},
}
}

所以,我有一个名为 files 的对象,它有许多属性,它们 1) 每次都有不同的名称,2) 每次都有不同的数量,以及 3) 带有字符的名称不能在 C# 属性中使用。

我如何反序列化它?

我将它放入一个可移植库中,所以我不能在 System.Web.Script.Serialization 中使用 JavaScriptSerializer,而且我不确定 JSON.NET。我希望使用标准的 DataContractJsonSerializer。


更新:我更改了示例数据以更接近实际数据,并更正了不重要区域的 JSON 语法。 (还是简化了不少,其他部分还是比较标准的)

最佳答案

您可以将您的"file" 对象建模为由 JSON 属性名称键入的 Dictionary:

public class RootObject
{
public Dictionary<string, PathData> files { get; set; }
}

public class PathData
{
public int size { get; set; }
public string data { get; set; }
public string data2 { get; set; }
}

然后,只有在使用 .Net 4.5 或更高版本时,才可以使用 DataContractJsonSerializer 进行反序列化,但必须先设置 DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true :

        var settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
var root = DataContractJsonSerializerHelper.GetObject<RootObject>(jsonString, settings);

使用辅助方法:

public static class DataContractJsonSerializerHelper
{
public static T GetObject<T>(string json, DataContractJsonSerializer serializer = null)
{
using (var stream = GenerateStreamFromString(json))
{
var obj = (serializer ?? new DataContractJsonSerializer(typeof(T))).ReadObject(stream);
return (T)obj;
}
}

public static T GetObject<T>(string json, DataContractJsonSerializerSettings settings)
{
return GetObject<T>(json, new DataContractJsonSerializer(typeof(T), settings));
}

private static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
}
}

或者,您可以 install Json.NET并做:

        var root = JsonConvert.DeserializeObject<RootObject>(jsonString);

Json.NET 自动将字典序列化为 JSON 对象,无需更改 settings .

关于c# - 如何使用非标准(和变化的)属性名称(在 .NET 中)反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750502/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com