[英]JSON: Error when converting to dictionary?
我在將JSON轉換為字典時遇到問題,有人可以幫忙嗎?
04:33:25-加載配置時出錯。 System.InvalidCastException:無法將類型為System.Int64的對象轉換為類型為System.String的對象。 在Seegal.Core.Extensions.JsonExtensions.ToFlatDictionary(JToken令牌,字符串路徑)中的C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtentions.cs:在Seegal.Core.Extensions中的第28行。 JsonExtensions。<> c.b__0_0(JProperty x)在C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtentions.cs:System.Linq.Enumerable.d__17的第19行
2.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
12.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func2 keySelector, Func
2 elementSelector,IEqualityComparer1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
來源,位於Seegal.Core.Extensions.JsonExtensions.ToFlatDictionary(JToken令牌,字符串路徑)的C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtensions.cs中的Func2 keySelector, Func
2 elementSelector) :在Seegal.Core.Extensions.JsonExtensions。<> c.b__0_0(JProperty x)中位於C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtensions.cs中的第18行:Sy中的第19行 stem.Linq.Enumerable.d__172.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func2 keySelector, Func
2元素選擇1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
,IEqualityComparer1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
2 keySelector, Func
1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func2 keySelector, Func
2 elementSelector)位於C:\\ Users \\ admin \\ workspace \\ Seegal中的Seegal.Core.Extensions.JsonExtensions.ToFlatDictionary(JToken令牌,字符串路徑) \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtensions.cs:Seegal.Core.Extensions.JsonExtensions中的第18行。<> c.b__0_0(JProperty x)在C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core中\\ Extensions \\ JsonExtentions.cs:System.Linq.Enumerable.d__17的第19行2.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1來源,Func2 keySelector, Func
2元素選擇器,1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1源,Func2 keySelector, Func
2 elementSelector)的IEqualityComparer1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
在C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Extensions \\ JsonExtentions.cs:Seegal.Core.Config.ConfigHandler.Load的第18行中的ore.Extensions.JsonExtensions.ToFlatDictionary(JToken令牌,字符串路徑) C:\\ Users \\ admin \\ workspace \\ Seegal \\ Seegal \\ Seegal \\ Core \\ Config \\ ConfigHandler中的(String apiUrl).cs:第49行
我要轉換成字典的JSON:
{
"bingo": {
"ftp" : {
"host" : "",
"port" : 21,
"username" : "",
"password" : "",
"enabled" : 0,
}
},
"snowman": {
"sockets" : {
"host" : "127.0.0.1",
"port" : 2000,
}
}
}
方法:
public static class JsonExtensions
{
public static Dictionary<string, string> ToFlatDictionary(this JToken token, string path = null)
{
switch (token.Type)
{
case JTokenType.Object:
return token.Children<JProperty>()
.SelectMany(x => x.Value.ToFlatDictionary(x.Name))
.ToDictionary(x => path == null ? x.Key : string.Join(".", path, x.Key), x => x.Value);
case JTokenType.Array:
return token
.SelectMany((x, i) => x.ToFlatDictionary(i.ToString()))
.ToDictionary(x => path == null ? x.Key : string.Join(".", path, x.Key), x => x.Value);
default:
return new Dictionary<string, string>
{
[path] = (string)((JValue)token).Value
};
}
}
}
轉換行,發生錯誤的行:
_configElements = JObject.Parse(responseText).ToFlatDictionary();
這是因為它似乎正在嘗試將int64值直接轉換為字符串。 如果您按如下所示調整默認語句,則代碼應開始工作
default:
return new Dictionary<string, string>
{
[path] = (((JValue)token).Value).ToString()
};
一個更安全的選擇是convert.ToString來防止NULL等。 但是對於眼前的問題,不使用類型轉換可以解決問題
您的默認情況下做出的假設無效。 值既不是數組也不是對象,並不意味着它可以轉換為為其值定義的字符串。
這是一個工作版本
static Dictionary<string, string> ToFlatDictionary(this JToken token, string path = null)
{
switch (token)
{
case JObject jo: return jo.Properties()
.SelectMany(x => x.Value.ToFlatDictionary(x.Name))
.ToDictionary(x => path == null ? x.Key : $"{path}.{x.Key}", x => x.Value);
case JArray ja: return ja
.SelectMany((x, i) => x.ToFlatDictionary(i.ToString()))
.ToDictionary(x => path == null ? x.Key : $"{path}.{x.Key}", x => x.Value);
case var v when v != null: return new Dictionary<string, string>
{
[path] = v.Value<string>()
};
default: return new Dictionary<string, string> { };
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.