重新创建特定的JSON结构

时间:2016-02-16 15:27:29

标签: java android ios json

我正在尝试在JAVA中重新创建以下JSON。

[{                  
"Operation": {
    Product: "MyProduct",
    Noun: "MyNoun",
    Verb: "MyVerb"
},
"Authentication": {
    UserID: "UserName",
    Password: "Password"
}}]

我觉得Maps是要走的路。但是我在构建合适的结构时遇到了麻烦。

Map<String,String> opsDictionary =  new HashMap<String,String>();
    opsDictionary.put("Product","MyProduct");
    opsDictionary.put("Noun","MyNoun");
    opsDictionary.put("Verb", "MyVerb");

Map<String,String> authDictionary =  new HashMap<String,String>();
    authDictionary.put("UserID","UserName");
    authDictionary.put("Password", "Password");


JSONObject postdata = new JSONObject();
postdata.put("Operation", opsDictionary);
postdata.put("Authentication", authDictionary);

哪个吐出 INCORRECT 版本:

{
    "Authentication": "{UserID=CADEMO, Password=TESTPASSORD}",
    "Operation": "{Noun=User, Product=TOPSInventory, Verb=Authenticate}"
}

我玩弄了捆绑地图的想法

Bundle dataBundle = new Bundle();
dataBundle.putStringArray("Operation", opsDictionary);
dataBundle.putStringArray("Authentication", authDictionary);

我做错了什么?

我能够使用词典在我的iOS版本中复制这种格式。

 NSMutableDictionary * dicOperation = [[NSMutableDictionary alloc]init];
    [dicOperation setValue:product forKey:@"Product"];
    [dicOperation setValue:noun    forKey:@"Noun"];
    [dicOperation setValue:verb    forKey:@"Verb"];

    NSMutableDictionary * dicAuthentication = [[NSMutableDictionary alloc] init];
    [dicAuthentication setValue:username   forKey:@"UserID"];
    [dicAuthentication setValue:password forKey:@"Password"];


    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dictPackage options:NSJSONWritingPrettyPrinted error:&error];

我希望Android有一个类似的解决方案。

4 个答案:

答案 0 :(得分:3)

您不需要使用Hashmap。这可能是导致字符串连接结果的原因。

应该读这个

JSONObject opsDictionary = new JSONObject();
    opsDictionary.put("Product","MyProduct");
    opsDictionary.put("Noun","MyNoun");
    opsDictionary.put("Verb", "MyVerb");


JSONObject authDictionary = new JSONObject(); 
    authDictionary.put("UserID","UserName");
    authDictionary.put("Password", "Password");


JSONObject postdata = new JSONObject();
postdata.put("Operation", opsDictionary);
postdata.put("Authentication", authDictionary);

如果您打算创建一个数组,最后附加到一个数组(循环或根据需要):

JSONArray ja = new JSONArray();
ja.put(postdata );

How to create correct JsonArray in Java using JSONObject

中的代码使用情况

答案 1 :(得分:-1)

我不确定我的回答。由于我使用jsonobject,jsonarray和Gson库,我只使用简单对象(字符串,布尔值,数字等...),“{}”定义的自定义对象和自定义对象数组。

在数组内部,所有元素(自定义或非自定义)都具有相同的结构。因此第一个元素的che字段与第二个元素相同。在你的情况下,我只看到一个关联数组,而不是一个真正的数组。我不确定Gson或json是否提供或对您的数据有用。 也许你必须使用一个自定义对象calles X wheere里面有两个自定义对象Y和Z,因为Y和Z有不同的结构。

但我再说一遍......也许我的想法是错误的。

答案 2 :(得分:-1)

你可以通过使用类创建json的正确结构来实现 序列化,根据需要反序列化。

第一堂课MyOperation

public class MyOperation{
    private String Product = "";
    private String Noun = "";
    private String Verb = "";

    //setters and getters
}

第二课MyAuthentication

public class MyAuthentication{
    private String UserID = "";
    private String Password = "";

    //setters and getters
}

和-holder-class MyContent

public class MyContent{
    private MyOperation Operation = new MyOperation();
    private MyAuthentication Authentication = new MyAuthentication();

    //setters and getters
}

您的JSON是MyContent类型的数组 你可以使用Gson序列化,反序列化:

//serialize example
MyContent myContent[] = new MyContent[1];
myContent[0] = new MyContent();
myContent[0].setMyOperation(....);
myContent[0].setMyAuthentication(....);

Gson gson = new Gson();
String jsonString = gson.toJson(myContent, MyContent[].class);

答案 3 :(得分:-2)

您报告的JSON无效。它并不重要,如果你想使用JSON,你必须遵循JSON规则。 如果您对格式有疑问,可以查看here

某些工作格式可能是这样的

{
     "Operation": [
    {
      "Product": "MyProduct",
      "Noun": "MyNoun",
      "Verb": "MyVerb"
    }
  ],
       "Authentication": [
      {
      "UserID": "UserName",
      "Password": "Password"
    }
  ]
}

通常,JSON可以被认为是树。树的每个节点都可以是:

  • 一个项目

    {
    "item1Name": "item1Value",
    "item2Name": "item2Value",
    ...
    }
    
  • 数组

    [
    "val1",
    "val2",
    ...
    ]
    
  • 子节点

    {
    "array": ["arrayitem1", ...],
    "itemX": "itemXValue",
    ...
    }
    

正确的值可以是数字或字符串,正确的&#34;键&#34;可以只是字符串。

在Java中,您可以轻松地将项目映射为Map<String, String>,将数组映射为List<Map<String,String>>

编辑: 一旦在结构中获得了正确的类,就必须使用正确的序列化器。否则将调用toString()并且错误的结果(如您所示)将出现