使用 Json.NET 递归反序列化,以便 JArray 成为 C++/CLI 中的列表

Recursively deserialize using Json.NET so that the JArray becomes a List in C++/CLI

我在 C++/CLI 中使用 Json.NET 反序列化 JSON。

假设我有以下字符串:

{
  "StrProp": ["str1", "str2"],
  "Flt": 42.2
}

我想从中得到一个 Dictionary<String^, Object^>^

首先要尝试的是 DeserializeObject:

Dictionary<String^, Object^>^ dict = Json::JsonConvert::DeserializeObject<Dictionary<String^, Object^>^>(json);

但是,我发现 dict["StrProp"] 是一个 JArray,而我希望它是 Collection 类型(如 array<String^>^)。

我意识到我可以创建某种类型的 JsonConverter,但我在如何确保与其解析字符串和 returning JArray 不同,它需要 return 集合类型(如数组<>)而不是特定的 Json.NET 类型。

有人吗?

C++/CLI 的非 LINQ-Select 解决方案基于在 .

中找到的 @BrianRogers 答案
Object^ ToObject(JToken^ token)
{
    switch (token->Type)
    {
        case JTokenType::Object:
        {
            Dictionary<String^, Object^>^ result = gcnew Dictionary<String^, Object^>();
            for each (JProperty^ prop in token->Children<JProperty^>())
            {
                result[prop->Name] = ToObject(prop->Value);
            }
            return result;
        }
        case JTokenType::Array:
        {
            List<Object^>^ result = gcnew List<Object^>();
            for each (JValue^ prop in token)
            {
                result->Add(prop->Value);
            }
            return result;
        }
        default:
        {
            return ((JValue^)token)->Value;
        }
    }
}

Object^ Deserialize(String^ json)
{
  return ToObject(JToken::Parse(json));
}

并使用它:

Object^ obj = Deserialize(jsonString);