转换为ServiceStack.Text中的对象

时间:2015-07-21 03:28:55

标签: servicestack-text

我有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;
    }

    //...
}

1 个答案:

答案 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"),
};