1

当 Json 字符串包含 'key1:value1' 时,可以将其转换为 Dictionary 类型。

但在我的例子中,它还包含一个字符串数组以及上面的键:值,即:

{k1:v1; "key2\":[{\"Key11\":{\"key21\":\"Val21\",\"key22\":\"val22\"}]

(Json 数据包含一些字符串和一些数组。)

当我使用 Dictionary<string, string[]> 或 Dictionary<string, ArrayList> 时 - 它在值作为字符串时失败 - 无法将字符串转换为字符串 [] 等。

仍然可以使用 Dictionary<string, object> ,但有没有更好的方法来处理这个问题?

谢谢帕尼

4

2 回答 2

1

如果您在编译时不知道结构,那么就没有其他方法可以序列化 JSON 字符串——它必须是 Dictionary<string,object>。但是,如果您使用的是 C# 4.0,则可以使用DynamicObject。由于动态类型将类型解析推迟到运行时,如果您使用这种方法进行序列化,您可以将序列化对象视为强类型(尽管没有编译时支持)。这意味着您可以使用 JSON 样式的点表示法来访问属性:

MyDynamicJsonObject.key2

为此,您可以从 DynamicObject 继承,并实现TryGetMember方法(引用自此链接,它具有完整的实现)

public class DynamicJsonObject : DynamicObject
{
    private IDictionary<string, object> Dictionary { get; set; }

    public DynamicJsonObject(IDictionary<string, object> dictionary)
    {
        this.Dictionary = dictionary;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = this.Dictionary[binder.Name];

        if (result is IDictionary<string, object>)
        {
            result = new DynamicJsonObject(result as IDictionary<string, object>);
        }
        else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
        {
            result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
        }
        else if (result is ArrayList)
        {
            result = new List<object>((result as ArrayList).ToArray());
        }

        return this.Dictionary.ContainsKey(binder.Name);
    }
}

请注意,动态类型目前不支持索引器表示法,因此对于数组,您需要使用如下表示法实现一种解决方法

MyDynamicJsonObject.key2.Item(0)
于 2012-05-08T16:29:25.347 回答
0

您的示例不是有效的 JSON,例如每个键和值都应该用 包围",例如{"k1":"v1"},开始和结束大括号的数量必须匹配,如果您"通过使用转义字符,则\"必须添加另一个"字符,例如"key2\""

使用JSONLint等工具来验证您的 JSON 是否正确。

于 2012-05-08T17:13:06.277 回答