JObject.SelectToken在.NET中等效

时间:2016-04-10 10:58:27

标签: c# json json.net

我需要删除JSON的外部节点。所以一个例子是:

{
    app: {
       ...
    }
}

关于如何删除外部节点的任何想法,所以我们只得到

{
   ...
}

没有使用JSON.NET,只有.NET Framework(C#)中的工具。

在Json.NET中我用过:

JObject.Parse(json).SelectToken("app").ToString();

或者,DataContractJsonSerializer的任何配置,以便在反序列化时忽略根,也可以。我现在进行去反编译的方式是:

protected T DeserializeJsonString<T>(string jsonString)
        {
            T tempObject = default(T);

            using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                tempObject = (T)serializer.ReadObject(memoryStream);
            }

            return tempObject;
        }

请注意,根对象的属性名称可能因具体情况而异。例如,它可以是"transaction"

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

.Net中没有内置SelectToken。但是,如果您只是想要打开外部根节点并且事先不知道节点名称,则可以使用以下选项。

  1. 如果您使用的是.Net 4.5或更高版本,则可以使用DataContractJsonSerializer.UseSimpleDictionaryFormat = true反序列化为Dictionary<string, T>

    protected T DeserializeNestedJsonString<T>(string jsonString)
    {
        using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
        {
            var serializer = new DataContractJsonSerializer(typeof(Dictionary<string, T>));
            serializer.UseSimpleDictionaryFormat = true;
            var dictionary = (Dictionary<string, T>)serializer.ReadObject(memoryStream);
            if (dictionary == null || dictionary.Count == 0)
                return default(T);
            else if (dictionary.Count == 1)
                return dictionary.Values.Single();
            else
            {
                throw new InvalidOperationException("Root object has too many properties");
            }
        }
    }
    

    请注意,如果您的根对象包含多个属性,则无法反序列化为Dictionary<TKey, TValue>以获取第一个属性,因为此类中的项的顺序未定义。 / p>

  2. 在任何支持数据合同序列化程序的.Net版本上,您可以利用DataContractJsonSerializer继承自XmlObjectSerializer来调用JsonReaderWriterFactory.CreateJsonReader()来创建{实际上读取JSON的{1}},然后跳到第一个嵌套的&#34;元素&#34;:

    XmlReader

    这种技术看起来很奇怪(使用protected T DeserializeNestedJsonStringWithReader<T>(string jsonString) { var reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.Unicode.GetBytes(jsonString), System.Xml.XmlDictionaryReaderQuotas.Max); int elementCount = 0; while (reader.Read()) { if (reader.NodeType == System.Xml.XmlNodeType.Element) elementCount++; if (elementCount == 2) // At elementCount == 1 there is a synthetic "root" element { var serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(reader, false); } } return default(T); } 解析JSON?),但是通过一些额外的工作,应该可以扩展这个想法,为JSON创建SAX-like parsing功能,类似于{{1在JSON中向前跳过,直到找到所需的属性,然后反序列化其值。

    例如,要选择和反序列化特定的命名属性,而不仅仅是第一个根属性,可以使用以下内容:

    XmlReader

    有关Mapping Between JSON and XML如何将JSON映射到XML的详细信息,请参阅JsonReaderWriterFactory