将Jackson JSON对象引用转换为JSON.Net对象引用

时间:2016-10-31 00:42:28

标签: java c# json jackson json.net

我需要能够使用C#/ JSON.Net客户端反序列化Jackson(Java / Spring服务器)生成的JSON字符串,同时保持对象引用不变。 Jackson使用" @ id":1 ... n进行循环引用,而引用用单个整数表示。 JSON.Net使用" $ id"和" $ ref"。

有人知道如何将JSON字符串从Jackson转换为JSON.Net兼容版本吗?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

将这些设置用于JSON.Net:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
};

使用此拦截器转换引用:

public static class JSONInterceptor
{
    public static string sanitizeJSON(string originalJSONFromJava)
    {
        // Get ID right from Jackson to JSON.Net
        string pattern = Regex.Escape(@"""@id"":") + "(\\d+)";
        string replacement = @"""$id"":""$1""";
        Regex rgx = new Regex(pattern);
        string output = rgx.Replace(originalJSONFromJava, replacement);

        // Convert Jackson reference in array
        pattern = @",(\d+)";
        replacement = @",{""$ref"":""$1""}";
        rgx = new Regex(pattern);
        output = rgx.Replace(output, replacement);

        // Convert single Jackson reference to ref
        pattern = Regex.Escape(@"""\\w+"":") + "(\\d+)";
        replacement = @"""$ref"":""$1""";
        rgx = new Regex(pattern);
        output = rgx.Replace(output, replacement);

        return output;
    }
}

调用拦截器并反序列化如下:

asset = JsonConvert.DeserializeObject<Asset>(JSONInterceptor.sanitizeJSON(response), settings);

资产类具有以下布局:

public class Asset {

    ....

     // Parent asset
     public Asset parent;
     // Asset agents
     public List<Agents> agent;

     ....
}

所以,杰克逊产生了类似的东西:

{"@id":1,......."parent":{"@id":15,.....},"agents":[{"@id":6, ......},12,{...}]...}

需要转换为类似(JSON.Net)的内容:

{"$id":"1",...,"$ref":"15",....,"agents":[{...,"$ref":"6",...]}

这就是上面的代码。

希望这有助于某人。