当前位置: 首页 > 面试题库 >

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

笪昌翰
2023-03-14
问题内容

我必须阅读一个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语法。(仍然简化了很多,但是其他部分是相当标准的)


问题答案:

您可以通过JSON属性名称将"files"对象建模为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 ?? ""));
    }
}

或者,您可以安装Json.NET并执行以下操作:

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

Json.NET会自动将字典序列化为JSON对象,而无需更改设置。



 类似资料:
  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 下面是从外部方接收的JSON字符串。 问题是我不喜欢类中的类名和字段名。相反,我希望将其命名为,并且将从字段名称中删除,并给出正确的名称。 我可以将重命名为,但如果更改字段名(类中的),它将无法正确反序列化,并给我。我怎样才能克服这些呢?

  • 问题内容: 我有以下从外部方收到的JSON字符串。 我的映射类: 现在的问题是,我不喜欢的 类名 和 字段名 的类。相反,我希望它被命名,并且还希望从字段名称中删除并提供适当的名称。 我可以重命名为,但是如果我更改了字段名(在类中),它将无法正确地反序列化并提供给我。我该如何克服呢? 问题答案: Json.NET具有允许您指定JSON属性名称的名称,因此您的代码应为: 文档: 序列化属性

  • 问题内容: 如何设置Newtonsoft.Json以使用旧成员名称反序列化对象,但使用当前成员名称序列化该对象? 编辑:一项要求是将过时的成员从要序列化/反序列化的类中删除。 这是一个需要序列化和反序列化的示例对象。我给了一个属性一个属性,该属性包含过去可能已序列化过的名称的列表。 我想始终使用名称“ a”对json进行序列化,但能够从任何旧名称(包括“ alpha”和“ omega”)以及当前名

  • 问题内容: 我想将一个简单的对象序列化为JSON: 但是只要我这样做: 属性名称不作为指定部分,但类似于那些直接定义在类如的情况下它不是,但。 我究竟做错了什么? 问题答案: 我通过使用此问题答案中提供的技术解决了这个问题: 这是我上的课: 用法: 我还必须修改初始类:

  • 问题内容: 我有一个REST API,它返回JSON响应为: 有时它返回: 我有一个像这样的POJO: 那么,有没有一种方法(不是写你自己的其他 自定义解串器 中)Jackson2,这将有助于我映射在JSON来时,它的A型和类型时,它是一个JSON对象? 或者换句话说,在Jackson中,有没有一种方法可以按变量而不是by 映射? 问题答案: 我可以建议您像这样使用JsonNode: 或像这样 :