我正在将一些JSON解析到CSV。我的课程设置如下:
public class SearchObj
{
public class Property
{
public string __cloudera_internal__hueLink { get; set; }
}
public class root
{
public string blockSize { get; set; }
public string clusteredByColNames { get; set; }
public string compressed { get; set; }
public string created { get; set; }
public string dataType { get; set; }
public string deleted { get; set; }
public Property properties { get; set; }
}
}
,然后在我使用此对象时:
string json = infile.ReadToEnd();
var rootObject = JsonConvert.DeserializeObject<List<SearchObj.root>>(json);
for (int i = 0; i < rootObject.Count; i++)
{
//holding is a dict that holds json key/value pairs,
//arg[1] is a prefix for key:value pairs, in this case, no prefix
//so a nested key goes into dictionary as key.nestedkey
ResolveTypeAndValue(rootObject[i], "", holding);
}
当然,我们需要查看解决方法的代码:
private static void ResolveTypeAndValue(object obj, string name, Dictionary<string, string> storage)
{
//this next line is the error problem
var type = obj.GetType();
foreach (var p in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
if (p.PropertyType.IsClass && p.PropertyType != typeof(string))
{
var currentObj = p.GetValue(obj);
ResolveTypeAndValue(currentObj, p.Name + ".", storage);
}
else
{
string val = "";
if (p.GetValue(obj) != null)
{
val = p.GetValue(obj).ToString();
}
storage.Add(name + p.Name, val);
}
}
}
因此,当我运行此操作时,我会得到一个"'type'system.nullReferenceException'的未手动例外'的例外。我相信这是因为大多数情况下,"属性"键是无效的。实际上,"适当的"键尽管仅嵌套只有一个密钥:" __cloudera_internal_huelink"的值对作为键,而HTML地址(本质上是文本)作为值。
。我在另一组JSON模式上成功运行了此代码,没有问题 - 但对于我的生活,我无法弄清楚如何将键/值对设置为" properties"之类的东西:" null"或"属性。以前嵌套的JSON对象在其中总是有一些东西,即使它因条目而异。
。您可能需要在新移民级别上提供帮助,我只使用C#,因为这就是我所有的东西 - 但显然我已经在So处理JSON对象的情况下选择了一两件事,但这让我坚硬地卡住了
i要么完全填充错误,要么根本没有填充"属性",而是抛出一个未找到错误的键
将ResolveTypeAndValue
功能更改为:
private static void ResolveTypeAndValue(object obj, string name, Dictionary<string, string> storage)
{
if (obj == null)
{
storage.Add(name, null);
return;
}
var type = obj.GetType();
foreach (var p in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
{
if (p.PropertyType.IsClass && p.PropertyType != typeof(string))
{
var currentObj = p.GetValue(obj);
ResolveTypeAndValue(currentObj, p.Name, storage); // removed this: '+ "."'
}
else
{
string val = "";
if (p.GetValue(obj) != null)
{
val = p.GetValue(obj).ToString();
}
storage.Add(name + "." + p.Name, val); // added this: '+ "."'
}
}
}