我有以下......
JArray clients = (JArray)clientsParsed["objects"];
foreach (JObject item in clients.Children())
{
// etc.. SQL params stuff...
command.Parameters["@MyParameter"].Value = JTokenToSql(item["thisParameter"]);
}
Run Code Online (Sandbox Code Playgroud)
JTokenToSql 看起来像这样......
public static object JTokenToSql(JToken obj)
{
if (obj.Any())
return (object)obj;
else
return (object)DBNull.Value;
}
Run Code Online (Sandbox Code Playgroud)
我也试过((JObject)obj).Count..但似乎没有工作.
我最近在使用Json.NET将JSON解析为动态对象时发现了null-coalescing运算符的问题.假设这是我的动态对象:
string json = "{ \"phones\": { \"personal\": null }, \"birthday\": null }";
dynamic d = JsonConvert.DeserializeObject(json);
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用?? 运算符在d的一个字段上,它返回null:
string s = "";
s += (d.phones.personal ?? "default");
Console.WriteLine(s + " " + s.Length); //outputs 0
Run Code Online (Sandbox Code Playgroud)
但是,如果我将动态属性分配给字符串,那么它工作正常:
string ss = d.phones.personal;
string s = "";
s += (ss ?? "default");
Console.WriteLine(s + " " + s.Length); //outputs default 7
Run Code Online (Sandbox Code Playgroud)
最后,当我输出Console.WriteLine(d.phones.personal == null)它时True.
我已经在Pastebin上对这些问题进行了广泛的测试.
我正在尝试使用Newtonsoft Json.Net序列化对象.
这个对象是一个匿名类型,充满了很多异类的东西,主要是普通的POCO,还有一些JObjects或JArrays.
问题是,在添加NullValueHandling属性时NullValueHandling.Ignore,每个null属性都会被忽略,但前提是它只是"常规".Net对象的一部分.内部JObject或JArray遗留的每个null属性.
这是一个最小的例子:
var jobj = JObject.FromObject(new Anything{
x = 1,
y = "bla",
z = null
});
var poco = new Foo {
foo1 = "bar",
foo2 = null
};
var serialized = JsonConvert.SerializeObject(new {
source1 = poco,
source2 = jobj
}, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以忽略这些空值?我错过了一些设置选项吗?或者我必须手动处理它?
我null在交易时遇到问题Newtonsoft.json.
我想查看结果null与否.基于此我想处理一些条件.
我的代码如下:
try {
var response = GetApiData.Post(_getApiBaseUrl, data.ToString());
var jsonString = response.ResultString;
var jsonContent = JObject.Parse(jsonString);
if (jsonContent["User"] != null) // <-- null handling
{
var user = JToken.Parse(jsonContent["User"].ToString());
membershipUser = GetMembershipUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
该jsonContent带null是如下:
{
"User": null
}
Run Code Online (Sandbox Code Playgroud)
如果"User": null在jsonContent["User"]回报{}和jsonContent["User"] != null条件没有抛出任何错误,而是跳越块,它执行内部线路.
所以为了null处理,我使用了这段代码:
if (jsonContent["User"].Value<string>() != null)
Run Code Online (Sandbox Code Playgroud)
如果"User": null,上面的代码工作正常.
但是如果jsonContent["User"]有有效数据,则会抛出错误.
无法将Newtonsoft.Json.Linq.JObject强制转换为Newtonsoft.Json.Linq.JToken
在jsonContent …
使用以下方法迭代jsonIm Newtonsoft.Json:
var jObject = JObject.Parse(sr.ReadToEnd());
foreach (KeyValuePair<string, JToken?> superior in jObject) {
...
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,JObject 实现了IEnumerable<KeyValueString<string, JToken?>>. 但我找不到JToken枚举中为空的情况。
我尝试过这个:
{
}
Run Code Online (Sandbox Code Playgroud)
{
"A": { }
}
Run Code Online (Sandbox Code Playgroud)
{
"A": ""
}
Run Code Online (Sandbox Code Playgroud)
{
"A": null
}
Run Code Online (Sandbox Code Playgroud)
...并且它始终不为空。那么为什么要使用枚举器JToken?呢?