我需要删除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"
。
感谢您的任何建议。
答案 0 :(得分:2)
.Net中没有内置SelectToken
。但是,如果您只是想要打开外部根节点并且事先不知道节点名称,则可以使用以下选项。
如果您使用的是.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>
在任何支持数据合同序列化程序的.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
。