簡體   English   中英

JSON:轉換為字典時出錯?

[英]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 1 2.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1源,Func 2 keySelector, Func 2 elementSelector,IEqualityComparer 1 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中的Func 2 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__17 2.MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1源,Func 2 keySelector, Func 2元素選擇1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable ,IEqualityComparer 1 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源,Func 2 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來源,Func 2 keySelector, Func 2元素選擇器, 1 comparer) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1源,Func 2 keySelector, Func 2 elementSelector)的IEqualityComparer 1 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM