使用 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);
我在 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);