我有JsonObject
代表以下JSON
{
"prop1": "text string",
"prop2": 33,
"prop3": true,
"prop4": 6.3,
"prop5": [ "A", "B", "C" ],
"prop6": { "A" : "a" }
}
在JInt脚本引擎中,有一个方法getProp(name:String) : Object
可以按名称查询属性。
所以在引擎中,这个方法就像
一样使用var p1 = getProp('prop1');
var p2 = getProp('prop2');
var p3 = getProp('prop3');
问题是:在C#中如何将属性转换为可以传递给脚本引擎的object
?
我尝试JsonObject.JsonTo<object>("prop5")
但它返回一个字符串而不是一个数组。
我不能使用JsonObject.JsonTo<string[]>("prop5")
,因为该属性可能是其他类型(字符串/数字/对象/布尔值)
更新:
以下丑陋的代码是我现在用来完成这项工作的。
它是不稳定的,因为"true"
之类的变量被转换为布尔值,即使它实际上是字符串类型。原因是ServiceStack的JsonObject将数据存储为JSV格式,我没有看到有办法将属性转换回JSON。
JsonObject properties = ...;
// this method is called from JInt script engine
public object getProp(string name)
{
string script = properties.GetUnescaped(name);
if (!string.IsNullOrWhiteSpace(script))
{
if (string.Equals(script, "true") || string.Equals(script, "false"))
return string.Equals(script, "true");
if (string.Equals(script, "null") || string.Equals(script, "undefined"))
return null;
int num1;
if (int.TryParse(script, out num1))
return num1;
decimal num2;
if (decimal.TryParse(script, out num2))
return num2;
if ( (script.StartsWith("[") && script.EndsWith("]")) )
return TypeSerializer.DeserializeFromString<object[]>( script );
if ( (script.StartsWith("{") && script.EndsWith("}")) )
return TypeSerializer.DeserializeFromString<object>(script);
return script;
}
//...
}
答案 0 :(得分:0)
原因是ServiceStack的JsonObject将数据存储为JSV格式,我不知道有办法将属性转换回JSON。
这是不正确的,JsonObject
与JSV格式无关或使用其TypeSerializer
实现。
如果要将其转换为对象,可以将其反序列化为与json形状匹配的POCO,例如:
public class TypeObject
{
public string Prop1 { get; set; }
public int Prop2 { get; set; }
public bool Prop3 { get; set; }
public double Prop4 { get; set; }
public string[] Prop5 { get; set; }
public Dictionary<string,string> Prop6 { get; set; }
}
var typeObj = json.FromJson<TypeObject>();
JsonObject
类仅用于动态地手动解析JSON,即不将其反序列化为具体类型。
以下是如何使用JsonObject单独解析值的示例,例如:
var obj = JsonObject.Parse(json);
var o = new TypeObject
{
Prop1 = obj["prop1"],
Prop2 = obj.Get<int>("prop2"),
Prop3 = obj.Get<bool>("prop3"),
Prop4 = obj.Get<double>("prop4"),
Prop5 = obj.Get<string[]>("prop5"),
Prop6 = obj.Object("prop6"),
};