【问题标题】:C# 2 dimensional byte[][] to JSON.NET to C# byte[][] or Javascript equivalant failsC# 2 维 byte[][] 到 JSON.NET 到 C# byte[][] 或 Javascript 等效项失败
【发布时间】:2014-07-22 17:16:07
【问题描述】:

我需要将字节[][] 从 C# WCF Web 服务发送到 JSON 客户端。

原始 WCF 结果如下(在倒数第二行查找AttributeData):

{ “SA”:[ “BCtVgTmz5ZcCH34SZcsQrWQq3B7QVXSiPE57Vj7yZ / TwDNO + V3UkMr6wZKn8Fiu9 + / YNG0iESAKz4EcbimeLzQU =”, “BHez / TgkoKbRwTu / lqS18h1hagY9N9j6 / + cZhuHacWPPTgsoMOzNDInKDR7j6M + 1VAqRtCRVC2qFI4q6NFE0bRQ =”, “BL4DnZQMV / kLa5n + LviukZI2wSbsNmJb7R / Zs51Z0neRmC / JJkw5hmmU7Pkl9WoHjlMR + CERNehOiLaYvUqZfyU =”,” BPdEcJW8iVB74Cvxm720vVwxDnbVTm / jrkZ5vPb12JOXTltcTOt7wH9IeMQG9oArvgdjTevmvif09TVtaaT7uLs =”, “BFOZjjprurgN8pQszEkrUOvMybTFuj5Uitg563Rh08PoukbRcfGlyhLuYzev8m94h1fCv + Zg8i1PI0vWkgOEmlM =”], “SB”:[ “BNTHLQWFFN / gFhQ + XaWfuONLZHBXHc1UMTqYSRtEPaqeSMe99wz3pKnHQdICzsvepY6btIRPLVFZCzK5MQ7v5Do =”, “BL6NBGy6vzJmPOJKu + WMQffLvnYw8gA + 7ZYiANTOP + / 5YpVELhsUva9OxS6CugsYvsaJIiAkV96ZbBVAyp9 / 2D0 =”, “BEWrUO7QXBPH68LEk7QTXAf064fBe8KTpy8MqsfcAAZ / nB10IHMnKBSdiU + nwNhnSnbc7zCsDSzA825iDQLv9yU =”, “BIJYfLEMeF + V6IG9jZBcEP4vp0FhEejX46uEup / lY890XNQEljFy4V1NUPSgDfTGxketJLyuaf + 0lTY1aeDEGTI =”, “BMwBbG / n3ylmxyo3wbxe6nODXyvJ0VpldnRZ6Wgpkn7CVcJMyXTMmhv5rxwwshq5Wbt6tFA4c3Bwy284KAAj5yI =”], “SZ”:“+ BN39ATET17jdkI02lCEr5eQQpRS2n3f1Q2tE BTDNY / HuLCCo8Gu3hHHgPVX7 / kPN7 KmHBJlmqniKBxx5nOcXwE=",

"sid":"这是新会话 id","ti":"TokenData","NumberOfTokens":5,"AttributeData":["QXR0cmlidXRlMA==","QXR0cmlidXRlMQ==","QXR0cmlidXRlMg==","QXR0cmlidXRlMw==","QXR0cmlidXRlNA== "]}

客户

C# 消费者的代码如下所示:

 var converter = new ExpandoObjectConverter();
 dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(dataJsonAsListedAbove, converter);
 byte[][] a = (byte[][]) obj.AttributeData;
//  byte[][] a = obj.AttributeData;  // same error

最后一行出现的错误如下

RuntimeBinderException 未处理

未处理的类型异常 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 发生在 System.Core.dll

附加信息:无法隐式转换类型 'System.Collections.Generic.List' 到 'byte[][]'

问题

如何在 C# 中正确解码 JSON 中的二维 Array[][]?

供您参考,C# 服务器代码如下所示:

        byte[][] attributes = null;
        if (attributes == null)
        {
            // Evaluate the client proposed attributes and add demo data in certain circumstances
            List<byte[]> attList = new List<byte[]>();
            for (int i = 0; i < ikap.IssuerParameters.E.Length; i++)
            {
                attList.Add(encoding.GetBytes("Attribute" + i));
            }
            attributes = attList.ToArray();
        }

   //
  //  snip.. .firstMessage is a JSONString that we are appending to using this awkward method
  //
    dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(firstMessage, converter);
        obj.sid = "this is the new session id";
        obj.ti = "TokenData"; 
        obj.NumberOfTokens = 5;
        obj.AttributeData = attributes;

    // Returning the JSON as a stream so that .NET WCF doesn't escape the raw JSON we're sending.
    return returnAsStream(JsonConvert.SerializeObject(obj));

【问题讨论】:

  • 尝试按照错误提示将其转换为列表,并在调试器中检查对象。
  • hmm...试图弄清楚如何使用dynamic 对象

标签: c# javascript json wcf json.net


【解决方案1】:

我在您的 json 中没有看到任何二维数组...

var obj  = JsonConvert.DeserializeObject<AClass>(DATA);
foreach (var data in obj.AttributeData)
{
    var buf = Convert.FromBase64String(data);
    Console.WriteLine(Encoding.UTF8.GetString(buf));
}

public class AClass
{
    public List<string> sa { get; set; }
    public List<string> sb { get; set; }
    public string sz { get; set; }
    public string sid { get; set; }
    public string ti { get; set; }
    public int NumberOfTokens { get; set; }
    public List<string> AttributeData { get; set; }
}

【讨论】:

  • 看起来 Json.NET 将 byte[][] 转换为 List
  • @makerofthings7 这没有任何意义。 json数据中没有byte[][]。显示被序列化以生成该 JSON 的类?
  • 我刚刚回滚了我的编辑以表明我在服务器上有一个 byte[][],正如你所描述的那样
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多