【问题标题】:How to create this nested JSON object in android and decode it in c#?如何在 android 中创建这个嵌套的 JSON 对象并在 c# 中对其进行解码?
【发布时间】:2015-10-24 23:47:22
【问题描述】:

过去几个小时我一直在为此苦苦挣扎,似乎我的想法只是让它变得越来越复杂,虽然我很接近,所以我想我应该寻求帮助。

我在C#有这门课:

public class MyTestObject
{
    public string name { get; set; }
    public string lastname { get; set; }
    public List<MyImages> {get; set; }
}

public class MyImages
{
    public string imageName { get; set; }
    public string imageBytes { get; set; }
}

我想在Android 中创建一个可以解析为该格式的JSONObject,但我不知道该怎么做..

这是我目前所拥有的(Android / Java):

Map<String, String> myParameters = new HashMap<>();
myParameters.put("name", "test");
myParameters.put("lastname", "test");

List<MyImage> images = getListOfImages();

if (images != null && images.size() > 0) {
    Map<String, String> jsonMap = new HashMap<>();

    for (MyImage image : images) {
        jsonMap.put(image.getImageName(), image.getImageBytes());
    }
    myParameters.put("images", jsonMap);
}

JSONObject data = new JSONObject(myParameters);

callWcfService(data); // makes a POST request to the service and passes the JSON object

理论上,这个“几乎”创建了所需格式的 JSON 对象,但是我无法在 c# 中对其进行解码。

这是 WCF 服务中应该解码 JSON 字符串的代码:

var reader = new StreamReader(data); 
var request = reader.ReadToEnd();
request = request.Replace("=", ":"); // i need to replace the `=` that is for some reason added in the JSON with `:`

var parser = new JavaScriptSerializer(); 
var myObject = parser.Deserialize<MyTestObject>(request); // it crashes here

例外是:

无法将“System.String”类型的对象转换为类型 'System.Collections.Generic.List`1[MyImages]'

从 java 代码生成的 JSON 如下所示:

{ “图像”:“{sl_big_ass_logo.png = iVBORw0KGgoAAAANSUhEUgAAAL8AAAC / CAIAAAAgiJpRAAAAAXNSR0IArs4c6QAAAARnQU1BAACx \ njwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAmCSURBVHhe7Z1PbxNHGMb5Jv0YPfQT9NaP0K9Q \ n5dw7l1aoJ9Qeqh44UlXigOBQVcoBpEhUogUERFWCgOD8cezEWZwYaJ9mhtUysde7777v7Izz / PQC \ nUGLPrplfZt5Zz9pXrv5897Mvv2WYtln7 / tcrwY8Ypnm8Pf8S0gbaQ + TQHiKH9hA5tIfIoT1EDu0h \ ncmgPkUN7iBzaQ + TQHiKH9hA5tIfIoT1EDu0hcmgPkUN7iBzaQ + TQHiInb3umZ8eL4h9BLMnGHggx \ nLga7o82X + w8fvbiz / vinJsEj8fiDo208l0qpk7Q96G90 / NZgI3CiS9Aa2iymI38M0oEU7UHXYoxp \ nPsCIszN8Mnm7749K2pOWPZhfnr9eD / o4QiAr5zUBqdhzOHkVYbCpDyokDkWt6N8edFjv3lQDhzgO \ nNaRPe2bvTtFVQeclEg5CTejNHpTGSQ05F0OBltKPPVgzB12VYCC3P12ygB7swQIn6Kdkw + Gnntj2 \ nZKQOgpWgP28yj6j25KUOgqLenzqZRzx7xsUg6Jv0Q3vqiWTP9Ow46JgsQnvqiWRPL + 8 / DA / tqSeG \ nPVmsz + eG9tRjbk + mc5YL7anH3B50QNAlGYX21GNrj93A8 + jFnZ3hk8PJKxwCmb07dUfEP9xPJm / 3 \ n8Vs8pkvJRXvqsbXHYuBBm213BkKpcTGASUFTS0N76jG0B30WdEbHbA02MKj41qVgTGq + 1ZX21GNo \ NJ + 5Sa3e06dvV4HRWNLnwjeHKP4HMw9AexWs8uuqUYHSs39PI97nqsbJHcdqKMH0sGiZ560U9Vvag \ nvAh6QhyI6Bu1BEcJymru71mKlT1ab 6cbzVmLQFXuHII63NyzFCt7tNbqnDtSxsqeQAJxfHPJczA + \ n2d4Zbjx + sf7nPzduP1gU / BaPeba9h8f7Z + ZM0vZkcbkFNlz95ffPv / 6hbdau3YJMvpU8MbEH1UPg \ ngSzp23P95r3AibZBC76tDKE9cnb2jwIVZMGU51vMDdojR8sezH2 + xdygPXJoT9L2IL7FJKE9qduT \ n8vUe2pO6PZGvNbeC9qRuD4LWfLuJQXtM7DmdFYEBXfL89bpvNzFoj4k9IDCgY9JcfNEeK3tqtlzJ \ nkmABRHus7MFoEXR / 92wNNnzraUB7rOw5nLwK + l4lGNLSKaJpj5U9usuuIInMYrTHyh6gXvpUg8Z7 \ n37JOewzt0dqcWhMs5nvcP0p7DO0xnbyqgUPjYuCPGhHaY2gPULyla2kwlx0cbce5AcNBe2ztUbwv \ np3kwY8ZZl9EeW3tAzOGnmpf2XzpBe8ztKaajoF9jxrQkoj3m9gCL686tYrS8pz0x7EEla3rtp2Fw \ nDiiJFMtq2hPDHtBL + bwoWuMQ7YlkD4hw8bB5VOYy2hPPHtB7ARQENXWXfdO0J6o9QPcLjlUCp2XF \ nEO2JbQ9IUCBEMJHRnh7sAYKPL40QDEL + / JpBe / qxB6T59QOopk9nhT / FZdCe3uwBWMancB0oCE6p \ n4VsctKdPewDK1dQWYi5NBKI9PdvjGBeDBAehpQLRniTscSR1OdGlfqcH7UnIHoCKNamJDCNizaUg \ n2pOWPQ78xafjUM1NZLQnRXsc6Ti06EIi7UnXHgccSuHS4tyLQLQndXscKD76rannXoamPXnYU4JJ \ NPK + 1 / cX1F + 3JzB7H5O1+/M32F4cf2pOlPY74ZXUw/NCejO1xNPyWP5XgQP6o59Ce7O1xxBmHUHL5\n451De1bEHgccsq6HqjtZac9K2ePAuizocsUcHG37w9CelbQHoBgyGoSqb1zQntW0x2G0gdq3TntqcW2G5gdq3TntqcW24 PUBeI9pSsvj0z7bvoy7fcac / q2wMmqnfR056SS2EPUFyC0Z6Sy2KP4kUg2lNy \ nWexBqRtIIA7tKbks9oBAAnFoTwntaR3aU0J7Wof2lNCe1invMaU9tKd1eK255LLYo7jmKu8upT2X \ nxR7FjwvyLdIeO3vGxQDVZc1N4JHRutZcvbOC9pjYU31Xcmf4pHeHFKct7i2som8Phpzgfxwylavc \ nXlDcMM99zVX07Vm0nwZzR5cPRxaDOTQ4ky7xjZ5De / TtCf67g2AYKFe8ETidFcEJdAlmYd / uObRH \ n2Z6GvRXHIZyM7r6w4LPoaI + yPa3qU8xlSz8bUIzuhIUEtwIC2tOnPS7old3RpmJJhHOwuK / 0YuFP \ NE / q3p4zTqMtohOca3YVzceABtCche6rBpIYSFX / uGJPQJioYf4BPwa9gDB5mMdhUM / EKA + 1J1J6k \ nApX9y / sU2kN7lmdRTUZ7aM + SBNd4qtAe2lOXucVyCe2hPXVZVK07aI + yPSDogHyz9NoB7dG3R2sn \ nTb9pctmJ9ujb0 + / Hcquk4RVL2qNvT + 6lT0N1AO3RtwdkOvxghdXq7TbaY2IPyE6grcFG2x20tMfK \ nHpDm90XOjWzjLO0xtAfgrzmF70eqycv9h / UXdWqgPbb2OFBHW78HLkj3vWm0J4Y9DjiUSDGEEqej \ nNw7aE8 + eEtRDRnu46uN2n0Fifx6doT092ONASQSNIlRFThqVwSaA9vRmTxWMB1j1wCStNRracVsT \ nxRVxE2hPEvZUwZjkZEJQayP1b5zht + 5h7il4brQbn2lPcvZkBO2hPXJoD + 2RQ3tojxzaQ3vkaNlz \ N4 / YDCBQtf23u + BfQGdojR8ue + Fm7duu4mPqX0QHaIydfe5C795 / 6l9GBePbMZrPTc44 + MhwOD1ri \ nn3l0NJ1O0dTZ2ZlvvQ + ytgfDj38ZHbCyB / 1aFAW6GV2 + u7v72pLBYICjjMfjk5MTKOXPwJ6s7UEO \ NX如果+ lUhRtgfSoBffvHnjO7YPcPTRaBRBo9ztwfn7VyJF0x6MNL4D0wAO + TOzIXd7sP7yr0SKpj2Y \ nPny / pcHe3p4 / Mxtoj6Y9Hz58mEwm1lVOE1AJYSB8 // 69PzMbaI + mPSVYXkEjTBwxTYIxh4eHx8fH \ n0RZitMfEngB0J2pY + PT / Uvt8FeYQFNf + MR + X7mgTLUcokOdCe2LYs6rQHtojh / bQHjm0h / bIORif \ nBP2RV7Z3hv6VSKE9nVi7divokoyCsdO / DCm0pxN37z8NuiSj + NfQAdrTlUyHn9 / ++女/ gA7Qnq6g \ N + RL + 817QN + MN + 7QFaI8Oz7b38NecxTiEk9TanEp7iBzaQ + TQHiKH9hA5tIfIoT1EDu0hcmgPkUN7 \ niBzaQ + TQHiKH9hA5tIfIoT1EDu0hcmgPkUN7iBzaQ + TQHiKH9hA5tIfIoT1EDu0hcj6xh2EEufLV \ nNz8GP2KYJvni6 + / + A1J / rql92ebRAAAAAElFTkSuQmCC \ N}”, “名称”: “测试”, “姓”: “测试”}

【问题讨论】:

  • 拜托,你能发布你的Android应用程序生成的序列化JSON吗?
  • @MatiasCicero 我已经添加了生成的 JSON。我认为问题在于我输入了图像名称。
  • 我认为问题在于 List&lt;MyImage&gt; 正在使 "images" 包含一个数组,但它包含一个字符串。
  • @MatiasCicero 我不确定我是否理解这一点。编辑:如果您能想到一个通用示例,我可以尝试根据它更改我的 java 代码。
  • 您的 "images" 属性不是嵌套的 JSON 数组,它是一个包含已序列化 JSON 的字符串(但序列化不正确,因为它的嵌入字符串周围缺少引号)。

标签: java c# android json wcf


【解决方案1】:

我不太了解Java,但我认为你的序列化算法是错误的,特别是这部分:

Map<String, String> jsonMap = new HashMap<>();

for (MyImage image : images) {
    jsonMap.put(image.getImageName(), image.getImageBytes());
}
myParameters.put("images", jsonMap);

"images" 不应包含Map&lt;String, String&gt;,而应包含JsonArray

由于myParameters 的类型为Map&lt;String, String&gt;,因此您无法将数组添加到哈希图中,因此我们必须寻找更灵活的解决方案。

尝试以下方法:

JsonObjectBuilder jsonObject = Json.createObjectBuilder();
jsonObject.add("name", "test");
jsonObject.add("lastname", "test");

JsonArrayBuilder jsonArray = Json.createArrayBuilder();
for(MyImage image : images)
{
   JsonObjectBuilder imageJson = Json.createObjectBuilder();
   imageJson.add("imageName", image.getImageName());
   imageJson.add("imageBytes", image.getImageBytes());
   jsonArray.add(imageJson.build());
}
jsonObject.add("images", jsonArray.build());

JsonObject data = jsonObject.build();
callWcfService(data);

然后,您的 WCF 服务应该根据您向我们展示的模型对其进行反序列化。

请注意,我提供的代码未经我测试,而是取自JsonArray's documentation

【讨论】:

  • 感谢您的解释。不幸的是,Android 中似乎没有 JsonArrayBuilder
  • @Apostrofix 哦,真令人失望。我希望该解决方案可以帮助您更好地了解您的问题
  • 谢谢,帮我解决了。我只需要将JsonObjectBuilder 替换为JsonObject,将JsonArrayBuilder 替换为JsonArray,这在Android 中确实存在,然后它就可以正常工作了。
  • @Apostrofix 没问题!很高兴就这么简单:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多